共计 714 个字符,预计需要花费 2 分钟才能阅读完成。
js 实现深拷贝有两种方法
第一(简单粗暴):
let arr = [1, {a: 2}];
let copyArr = JSON.parse(JSON.stringify(arr) );
console.log(copyArr) // [1, {a: 2}]
arr[1].a = 3;
console.log(copyArr) // [1, {a: 2}]
copyArr[1].a = 5;
console.log(arr) // [1, {a: 2}]
可以看出来,改变原数组 arr,并没有对新数组 copyArr 产生影响;改变新数组 copyArr 也没有对原数组 arr 产生影响;
第二(面试官大多数会问这种方法):
let arr = [1, {a: 2}];
function deepCopy(arr) {
let copyArr = (arr.constructor === Array) ? [] : {}; // 判断是数组还是对象
for(let i in arr) {
if(typeof arr[i] === ‘object’) {// 判断是值类型还是引用类型
copyArr[i] = deepCopy(arr[i]); // 引用类型的话进行递归操作
} else {
copyArr[i] = arr[i]; // 值类型直接赋值
}
}
return copyArr;
}
let copyArr = deepCopy(arr);
console.log(copyArr) // [1, {a: 2}]
arr[1].a = 3;
console.log(copyArr) // [1, {a: 2}]
copyArr[1].a = 5;
console.log(arr) // [1, {a: 2}]
同样:改变原数组 arr,并没有对新数组 copyArr 产生影响;改变新数组 copyArr 也没有对原数组 arr 产生影响;