天天看點

js Object.assign() 方法 拷貝

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是淺拷貝還是深拷貝?