js实现一个浅拷贝
浅拷贝的实现方法
浅拷贝是指创建一个新对象,该对象复制原始对象的属性值。如果属性是基本类型,拷贝的是值;如果属性是引用类型,拷贝的是内存地址,因此新旧对象会共享同一块内存。以下是几种常见的浅拷贝实现方法。
使用展开运算符(Spread Operator)
展开运算符可以快速实现对象的浅拷贝。
const original = { a: 1, b: { c: 2 } };
const copy = { ...original };
console.log(copy); // { a: 1, b: { c: 2 } }
使用Object.assign()
Object.assign()方法可以将所有可枚举属性从一个或多个源对象复制到目标对象。
const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);
console.log(copy); // { a: 1, b: { c: 2 } }
使用Array.slice()(针对数组)
对于数组,可以使用slice()方法实现浅拷贝。
const original = [1, 2, { a: 3 }];
const copy = original.slice();
console.log(copy); // [1, 2, { a: 3 }]
使用Array.concat()(针对数组)
concat()方法也可以用于数组的浅拷贝。
const original = [1, 2, { a: 3 }];
const copy = original.concat();
console.log(copy); // [1, 2, { a: 3 }]
手动实现浅拷贝
可以通过遍历对象的属性手动实现浅拷贝。
function shallowCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = obj[key];
}
}
return copy;
}
const original = { a: 1, b: { c: 2 } };
const copy = shallowCopy(original);
console.log(copy); // { a: 1, b: { c: 2 } }
注意事项
- 浅拷贝只复制对象的第一层属性,嵌套对象仍然是引用。
- 如果原始对象包含引用类型的属性,修改拷贝对象的引用属性会影响原始对象。
const original = { a: 1, b: { c: 2 } };
const copy = { ...original };
copy.b.c = 3;
console.log(original.b.c); // 3
以上方法适用于大多数场景,但需要根据实际需求选择合适的实现方式。







