Object.assign
是ES6中的一個方法。該方法能夠實現對象的淺復制以及對象合并。Object.assign
并不會修改目標對象本身,而是返回一個新的對象,其中包含了所有源對象的屬性。
例1 2個對象合并
const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };const mergedObject = Object.assign(target, source);console.log(mergedObject); // { a: 1, b: 3, c: 4 }
console.log(target); // { a: 1, b: 3, c: 4 }
上述例子中,mergedObject 是合并了 target 和 source 的屬性的新對象。其中 target 對象的 b 屬性的值被從源對象 source 中繼承并覆蓋了。
例2 多個對象合并到一個目標對象中
const target = {};
const source1 = { a: 1 };
const source2 = { b: 2 };const mergedObject = Object.assign(target, source1, source2);console.log(mergedObject); // { a: 1, b: 2 }
Object.assign
是淺復制。它只會復制對象的屬性的引用,而不會遞歸復制嵌套對象。如果源對象包含對象屬性,復制后的結果中仍然 引用 相同的嵌套對象。這意味著,無論在哪個對象中修改這個嵌套對象,所有引用該對象的地方都會受到影響,因為它們引用的是同一個對象。
const target = {};
const source = { nested: { a: 1 } };const mergedObject = Object.assign(target, source);console.log(mergedObject); // { nested: { a: 1 } }
console.log(mergedObject.nested === source.nested); // true
- 當涉及深層嵌套對象并使用淺復制時,改變一個對象的嵌套屬性會影響所有引用該屬性的對象,因為它們實際上引用的是相同的對象。
// 原始的源對象
const source = {nested: {a: 1,b: {c: 2}}
};// 使用 Object.assign 進行淺復制
const target = Object.assign({}, source);// 修改深層嵌套對象的屬性
target.nested.b.c = 3;console.log(source); // { nested: { a: 1, b: { c: 3 } } }
console.log(target); // { nested: { a: 1, b: { c: 3 } } }
console.log(source === target); // false
console.log(source.nested === target.nested); // true
console.log(source.nested.b === target.nested.b); // true
在這個例子中,當我們修改 target.nested.b.c
的值時,source 對象的相應屬性也會被修改,因為 source.nested
和 target.nested
引用同一個嵌套對象。盡管 source 和 target 對象不是同一個對象,但它們的嵌套屬性引用是相同的,因此修改一個對象的屬性會影響到另一個對象。