JS数据类型可以分为(ES5,暂时不考虑ES6):
(1)简单数据类型:Number、String、undefined、boolean、null
(2)复杂数据类型:Object、Array
简单的数据类型,往往是赋值操作,而复杂数据类型是引用操作。
深浅拷贝原理
浅拷贝原理
|
|
浅拷贝:只会将对象的各个属性进行依次复制,并不会进行递归复制,而js存储对象都是存地址的,所以浅复制会导致obj.c和shallowCopy.c 指向同一块内存地址;会导致引用。
深拷贝原理
|
|
深复制:它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上,最核心的思想还是采用递归的方式,不断进行,直到基本数据类型后,再复制。
数组的深浅拷贝
数组浅拷贝
|
|
当改变arr1数组中的元素的时候,arr2也会改变,如何避免上面的情况发生呢那就是深拷贝了。
数组深拷贝
方法一:slice方法
方法二:concat方法
方法三:最简单的深拷贝实现方式
缺点:原型链没了,对象就是object,所属的类没了。
序列化然后反序列化重新生成一个新的数组(引用对象)。
对象的深浅拷贝
对象浅拷贝
法一:
法二:Object.assign()
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
对象深拷贝
法一:
法二:
法三:Object.create()
Object.create() 方法使用指定的原型对象和其属性创建了一个新的对象。
上面这句话说明了b的原型指向a的prototype属性。
法四:new object()