一篇水文,我说说我的理解,我希望这篇文章能帮助部分初学者在回答浅拷贝的时候不要答成赋值操作了。
问题
最近跟同学做面试互问。 问他什么叫浅拷贝,他给我上了代码
let a = [1];
b = a
如果你也觉得这是一个浅拷贝,没毛病啊,那你看我下文是怎么钻牛角尖的。
同学:'喏,浅拷贝'
我:'g'
这不赋值吗?何来拷贝?连拷贝都算不上吧。
同学:'你改b,a不就跟着改了吗。'
我:'对啊,这不是赋值吗,'
同学:'啊这'
菜鸡互啄群里问了一波好像好多人都认同这个叫浅拷贝,我说说我的理解。
在 mdn 上面,你会发现你找不到浅拷贝的定义的,shallow copy,只能搜到官方说 Array.prototype.slice()是一个shallow copy。
康康
那就来试试呗,
var a = [ 1, 3, 5, { x: 1 } ];
var b = Array.prototype.slice.call(a);
b[0] = 2;
console.log(a); // [ 1, 3, 5, { x: 1 } ];
console.log(b); // [ 2, 3, 5, { x: 1 } ];
var c = a;
c[0] = 2;
console.log(a); // [ 2, 3, 5, { x: 1 } ];
console.log(c); // [ 2, 3, 5, { x: 1 } ];
see
下面来实现浅拷贝:循环遍历赋值。
const a = [ 1, 3, 5, { x: 1 } ];
const shallowCopy = (obj) => {
const res = Array.prototype.isArray.call(obj) ? [] : {};
for(let i in obj){
res[i] = obj[i];
}
return res;
}
这才是 拷贝 嘛
盗个图