Object.assign( ) 实现浅克隆
时间: 2024-10-29 10:06:11 浏览: 13
`Object.assign()` 是 JavaScript 中的一个内置函数,用于将源对象(source object)的所有可枚举属性浅拷贝到目标对象(target object)。这个方法不会改变源对象,而是创建一个新的对象,并把源对象的属性复制过去。
基本语法如下:
```javascript
Object.assign(target, source1, source2, ..., sourceN);
```
其中 `target` 是接收属性的目标对象,`source1`, `source2`, ... 是要复制的源对象。每个源对象的属性会逐个添加到目标对象上。
例如,如果你有一个对象 `objA` 和一个空对象 `objB`,你可以这样做:
```javascript
let objA = { a: 1, b: { c: 2 } };
let objB = {};
// 使用 Object.assign() 进行浅克隆
Object.assign(objB, objA);
console.log(objB); // 输出: { a: 1, b: { c: 2 } }
```
这里的 `b` 属性本身是一个嵌套的对象,`Object.assign()` 只会复制一层,如果 `b` 对象还有更深的层次结构,那么深层的属性不会被复制。
相关问题
如何使用 JavaScript 的 Object.assign 进行深度克隆操作?
在JavaScript中,`Object.assign()` 方法主要用于浅复制对象,它将所有指定的对象的属性和值都复制到目标对象上,但如果源对象中有循环引用或者函数、RegExp等无法深拷贝的特殊类型,那么结果会指向原对象,而非完全独立的副本。
如果你需要进行深度克隆,应该使用递归或者其他专门的库,如 `lodash.cloneDeep` 或者 `JSON.parse(JSON.stringify(obj))`。下面是一个简单的例子:
```javascript
function deepClone(obj, hash = new WeakMap()) {
if (obj instanceof RegExp) return new RegExp(obj);
if (obj instanceof Date) return new Date(obj);
if (obj === null || typeof obj !== 'object') return obj;
let clone = hash.get(obj);
if (clone) return clone;
clone = Array.isArray(obj) ? [] : {};
hash.set(obj, clone);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], hash);
}
}
return clone;
}
// 使用示例
let originalObj = { a: { b: [1, 2, 3] } };
let clonedObj = deepClone(originalObj);
```
objecy.assign是浅克隆还是深克隆?
`Object.assign()` 是浅克隆。在 JavaScript 中,如果对象的属性值是基本数据类型(比如字符串、数字、布尔值等),那么该属性值会被复制到新对象中。但如果对象的属性值是引用类型(比如数组、对象、函数等),那么新对象中的该属性值只是源对象中该属性值的引用,也就是说,源对象和新对象中的该属性值指向同一个内存地址,修改其中一个对象的该属性值会影响另一个对象的该属性值。
下面是一个简单的例子,演示了 `Object.assign()` 的浅克隆特性:
```
let obj1 = {
a: 1,
b: {
c: 2
}
};
let obj2 = Object.assign({}, obj1);
console.log(obj1.b.c); // 输出 2
console.log(obj2.b.c); // 输出 2
obj1.b.c = 3;
console.log(obj1.b.c); // 输出 3
console.log(obj2.b.c); // 输出 3
```
在上面的例子中,我们使用 `Object.assign()` 将 `obj1` 对象浅克隆到 `obj2` 对象中。然后我们修改了 `obj1.b.c` 的值,发现 `obj2.b.c` 的值也被修改了,这是因为 `obj1.b` 和 `obj2.b` 指向同一个对象,所以修改其中一个对象的 `c` 属性值会影响另一个对象的 `c` 属性值。
阅读全文