数组(引用类型)复制问题

9次阅读

共计 1445 个字符,预计需要花费 4 分钟才能阅读完成。

数组赋值问题涉及到拷贝、堆栈空间、基本数据类型和引用数据类型的差异。(自行了解)
var arrA = [1,2,3,4,5];
var arrB = arrA;
// 把 B 数组值重置成 0;
arrB.fill(0);
console.log(arrA);
console.log(arrB);
输出结果是:arrA = [0,0,0,0,0], arrB = [0,0,0,0,0]
arrB 的修改的同时也修改了 arrA 的值。
可采用浅拷贝和深拷贝解决问题:

浅拷贝子对象是基础数据类型的修改不受影响,子对象是引用数据类型仍然会受影响
深拷贝,子对象是引用数据类型也不受影响。

var arrA = [1, 2, 3, 4, 5];
var arrB = arrA.slice(0, 5);
// 把 B 数组值重置成 0;
arrB.fill(0);
console.log(arrA);
console.log(arrB);
输出结果是:arrA = [1, 2, 3, 4, 5], arrB = [0, 0, 0, 0, 0];
var arrA = [1, 2, [3, 4], 5, 6];
var arrB = arrA.slice(0, 5);
// 把 B[2] 数组值重置成 0;
for (var i = 0; i < arrB.length; i++) {
if (arrB[i].length > 0) {
arrB[i].fill(0);
}
}
console.log(arrA);
console.log(arrB);
输出结果是:arrA = [1, 2, [0,0], 5, 6], arrB = [1, 2, [0,0], 5, 6];
亲测:用 arrA.slice()/arrA.concat()/[…arrA]/Array.from(arrA)/Array.prototype.push.apply(arrB, arrA)/ arrA.map(function(item){return item;}); 等方法进行数组复制都是浅拷贝。(Object.assign({}, objA) 对象浅拷贝)
var arrA = [1, 2, [3, 4], 5, 6];
var arrB = JSON.parse(JSON.stringify(arrA));
// 把 B 数组值重置成 0;
arrB[2].fill(0);
console.log(arrA);
console.log(arrB);
输出结果是:arrA = [1, 2, [3, 4], 5, 6], arrB = [1, 2, [0, 0], 5, 6];
var arrA = [1, undefined, [3, 4], 5, 6];
var arrB = JSON.parse(JSON.stringify(arrA));
// 把 B 数组值重置成 0;
arrB[2].fill(0);
console.log(arrA);
console.log(arrB);
输出结果是:arrA = [1, undefined, [3, 4], 5, 6], arrB = [1, null, [0, 0], 5, 6];
亲测: JSON.parse(JSON.stringify(arrA))JSON 转换是深拷贝,但是如果值为 undefined 会被转为 null。
let arrA = [1, 2, [3, 4], 5, 6];
let arrB = _.cloneDeepWith(arrA);
// 把 B 数组值重置成 0;
arrB[2].fill(0);
console.log(arrA);
console.log(arrB);
输出结果是:arrA = [1, undefined, [3, 4], 5, 6], arrB = [1, null, [0, 0], 5, 6];
可使用第三方库如 lodash 封装的方法。

正文完
 0