1. 深拷贝与浅拷贝
浅复制,只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“浅拷贝(浅复制)”。
深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。
- 深复制在计算机中开辟了一块内存地址用于存放复制的对象。
- 浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
2. 浅拷贝
举个最常见的栗子:
1 | var obj = { |
obj2
是 obj
的一个副本,如果我们给 obj
添加一个值会怎样呢?
1 | obj.data.push(4); |
通过打印,如果我们对 obj
中的对象属性(这里指数组 data)进行操作,那么浅拷贝出来的对象也会被改变。
3. 数组深拷贝
3.1 for 循环
1 | var arr1 = [1,2,3,4,5] |
3.2 slice
1 | var arr1 = ['George','John','Thomas','James','Adrew','Martin']; |
3.3 concat
1 | var arr1 = [1,2,3,4,5]; |
3.4 扩展运算符(ES6)
1 | var arr1 = [1,2,3,4,5]; |
3.5 Array.from
1 | var arr1 = [1,2,3,4,5]; |
4. 对象深拷贝
1 | var obj = { |
4.1 递归方法
1 | function copy(obj1, obj2){ |
4.4 JSON.parse 方法
1 | var obj2 = JSON.parse(JSON.stringify(obj)); |
缺点:
NaN
、Infinity
会被转换成null
function
会被删掉- 无法拷贝循环引用