概述
之前踩过一些复制的坑,现在总结一下记录下来,供以后开发时参考,相信对其他人也有用。
对象的浅复制和深复制
浅复制:一般用Object.assign,如果支持es6的话也可以用新语法:
const obj = {
a : 1,
b : 4
};
//可以用Object.assign
const obj2 = Object.assign({}, obj1);
//es6的解构
const obj2 = { ...obj };
//其实下面这种写法也可以,但是建议使用上面的写法
const { ...obj2 } = obj;
深复制:建议用JSON.parse和JSON.stringify方法。
const obj = {
a : [2, 4, 6],
b : 4
};
const obj2 = JSON.parse(JSON.stringify(obj));
在如下2种情况下不要用上面的方法:
- 对象太大了。由于性能关系,耗时太长。
- 对象不是JSON不变的,也就是说,JSON.parse(JSON.stringify(obj)) != obj。
碰到这2中情况,还是老老实实用递归吧。
数组的浅复制和深复制
浅复制:有很多种方法,不过一般用slice:
const a = [2, 3, 5];
//下面的b,c,d都实现了浅复制
const b = a.slice();
const c = a.concat();
const d = [ ...a ];
深复制:这个最好用库的方法。
jquery库的浅复制和深复制
使用$.extend方法。
const x = {
a: 1,
b: { f: { g: 1 } },
c: [ 1, 2, 3 ]
};
const y = $.extend({}, x), //浅复制
z = $.extend(true, {}, x); //深复制
其它
复制数组和对象的时候一定要注意是不是浅复制。如果只想深复制数组或对象的部分内容,可以先深复制整个对象,再浅复制得到的对象。(如果要性能的话,也可以看情况手动优化。)