Object.assign方法用于對象的合并,将源對象(source)的所有可枚舉屬性,複制到目标對象(target)。
文法
Object.assign()方法的文法:
Object.assign(target, ...sources );
----------參數說明--------------
1.target:必需,接收複制屬性的目标對象
2.sources:必需,待複制屬性的對象
----------Object.assign()方法注意事項------------
1.待複制的屬性必須是可枚舉
2.待複制的屬性必須是自有屬性,不能繼承自原型鍊
3.Object.assign()進行的是淺拷貝---隻周遊第一級對象屬性
4.Object.assign()方法是ES6(ES2015)中新增的方法
用法
const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
let test = Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
console.log(test) // {a:1, b:2, c:3}
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
深拷貝還是淺拷貝?
let source = { a: 1 };
let target = Object.assign({}, source);
console.log(target) // { a: 1 }
source.a = 2;
console.log(source) // { a: 2 }
console.log(target) // { a: 1 }
target的值并沒有随着source的變化而變化
let source = { a: { b : 1 }, c: 1 };
let target = Object.assign({}, source);
console.log(target) // { a: { b: 1 }, c: 1 }
source.a.b = 2;
source.c = 3
console.log(source) // { a: { b: 2 }, c: 3 }
console.log(target) // { a: { b: 2 }, c: 1 }
看下阮一峰老師對Object.assign()的解釋:
JS對象分為基礎類型和引用類型,基礎類型(Number, String, Boolean…)直接存儲于棧中,引用類型(Object…)棧中存儲指向存儲在堆中的對象的指針。
Object.assign()拷貝的是屬性值,如果源對象的屬性值是一個指向對象的指針,那也隻拷貝那個指針。是以如果對象的屬性值為基礎類型,對于通過Object.assign()拷貝的那個屬性而言是深拷貝;如果對象的屬性值為引用,對于通過通過Object.assign()拷貝的那個屬性而言其實是淺拷貝的
參考:Object.assign是淺拷貝還是深拷貝?