本文记录的是我不熟悉或者我认为值得注意的地方,并非书上知识点的归纳数组
对象是按引用传递的(我理解的是传值其实传的是一个指针,该指针指向内存中的某个对象)。举例以下:安全
const a = {name: 'aaa'} const b = a // 这时候a和b其实指向的是同一个对象 console.log(b.name) // aaa b.name = 'bbb' console.log(b.name) // bbb console.log(a.name) // bbb 在改变b时a也被改变了
对于简单的对象(属性的值都为基本数据类型),赋值时采用const b = {...a}
或者const b = Object.assign({}, a)
能够使得b
中的对象是一个新对象函数
Lodash
提供了cloneDeep()
函数用于深拷贝优化
对象按引用传递是由于这样比较节约内存(毕竟多个对象其实只存了一份嘛),弊端就是容易引发不被但愿的变化。this
JS具备自动垃圾回收机制,开发人员不用关心内存使用问题,其原理是找出再也不继续使用的变量,释放其占用的内存指针
最经常使用的回收方式是标记清除
,另外一个不太常见的是引用计数
code
在引用计数
中,没法处理循环引用
(对象a
中包含指向b
的指针,对象b
中也包含指向a
的指针),举例以下对象
function problem() { const a = {} const b = {} a.obj = b b.obj = a }
能够经过在函数结尾断开引用来解决循环引用
的问题,以下排序
function problem() { const a = {} const b = {} a.obj = b b.obj = a // 别的啥啥操做 // 设为null便可 a.obj = null b.obj = null }
优化内存占用:无用的数据将其值设为null
内存
引用类型的值(对象)是引用类型的一个实例
新对象是new
操做符后面跟一个构造函数
来建立的
数组的sort()
方法默认是按从小到大排序,会根据每一项的toString()
方法获得的字符串进行排序。因为是比较的是字符串,在大多数状况下,排序结果不是咱们指望的(好比'10'<'5'
),咱们须要本身去写一个排序函数传给sort()
数组的concat()
能够接受多个参数,以下
const a = [1, 2] const b = a.concat(3, [4, 5]) console.log(b) // [1, 2, 3, 4, 5]
数组的splice()
用于在数组中插入一个或者多个值,以下
const a = [1, 4, 5] a.splice(1, 0, 2, 3) // 接收的参数依次为 index,要删除的元素个数,要插入的元素们 console.log(a) // [1, 2, 3, 4, 5]
因此数组的splice()
也可用于替换数组中的某些项,以下
const a = [1, 2, 3, 4, 5] a.splice(1, 2, 22, 33) console.log(a) // [1, 22, 33, 4, 5]
因为函数也是对象,因此函数名实际上是一个指向函数对象的指针
定义一个函数能够用函数声明 function funcName() {}
或者函数表达式 const func = function() {}
, 建议用函数表达式
定义函数,好处是定义以后不可被修改,也不会存在函数声明提高
函数内部有两个特殊对象,arguments
和this
,arguments
是一个类数组对象,包含着全部传入函数中的参数,this
指向的是函数执行的环境对象
字符串的toLocaleLowerCase()
是针对地区做了特殊处理的(不一样地区对于某些值的转换规则会有些不同),相对于toLowerCase()
来讲更安全
完。