面试题答案
一键面试可以使用对象的解构赋值或者 Object.assign()
方法来创建对象的副本,避免引用导致的问题。
- 使用解构赋值:
let a = {x: 1};
let b = {...a};
b.x = 2;
console.log(a.x);
这样 a.x
的值仍为 1
,因为 b
是 a
的一个浅拷贝。
- 使用
Object.assign()
方法:
let a = {x: 1};
let b = Object.assign({}, a);
b.x = 2;
console.log(a.x);
同样,这里 a.x
的值还是 1
,Object.assign()
方法也创建了 a
的一个浅拷贝。
如果对象包含嵌套对象,要进行深拷贝,可以使用 JSON.parse(JSON.stringify())
(但这种方法有局限性,无法处理函数、正则等特殊对象),或者使用更复杂的递归深拷贝函数。例如:
function deepClone(obj) {
if (typeof obj!== 'object' || obj === null) {
return obj;
}
let clone = Array.isArray(obj)? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
let a = {x: {y: 1}};
let b = deepClone(a);
b.x.y = 2;
console.log(a.x.y);
此时 a.x.y
的值仍为 1
。