ES6的Object.assign()

ES6新增了很多語法,今天我們來詳細瞭解一下Object對象的新方法assign();

使用方法:

我們之前需要拷貝一個對象的屬性的時候是這樣的:

var a = { aa: "123" };

var b = { bb: "456" };

var c = { cc: "789" };

c.aa = a.aa;
c.bb = b.bb;

// 結果: c = {cc: "789", aa: "123", bb: "456"}

如上所示,這是我們以前常用的屬性賦值,但是有了Object.assign()後可以這樣:

var a = { aa: "123" };

var b = { bb: "456" };

let c = Object.assign({ cc: "789"}, a, b);

// 結果: c = {cc: "789", aa: "123", bb: "456"}

 這樣一下,瞬間省了很多代碼,而且更加清晰明瞭有木有。並且,它還能夠給默認值,例如:

let a = { aa: "123" };

let b = Object.assign( {bb="111",aa="222"}, a);

///結果b = {bb: "111", aa: "123"}

 如果目標對象中有屬性與源對象相同的屬性,那麼最後將會覆蓋掉目標對象中的屬性值,也就是後面的相同屬性會覆蓋掉前面的屬性值。

注意:

網上對於Object.assign()的說法不一致,有的說的深拷貝有的說是淺拷貝,當然官方說的是淺拷貝,但是,做了如下測試後:

let a = { aa: "123", ab: "34", ac: 12 };

let b = Object.assign({},a);

b.aa = "456";

// 結果 a = {aa: "123", ab: "34", ac: 12};
//      b = {aa: "456", ab: "34", ac: 12};

哎,這結果就很有趣了,這明明就是深拷貝啊,再看看下面的例子:

let a = { aa: "123", ab: { abb: "456"}};

let b = { bb: "789" };

let c = Object.assign({}, b, a);

c.ab.abb = "111111";

//結果: c = { aa: "123", ab: {abb: "111111"}, bb: "789" };
        b = { bb: "789" };
        a = { aa: "123", ab: { abb: "111111"}};

是不是發現a的ab屬性變了?這是怎麼回事呢?

官方的說法是:Object.assign()只會從來源物件將自身可列舉的屬性複製都目標物件。

我的理解是:Object.assign()只會複製源對象的屬性值,如果屬性值是的數據類型是基本數據類型(string,number等)的話,將會直接複製值,如果是引用數據類型(object,array)的話,它只會複製源對象屬性的引用。

所以對於Object.assign是深拷貝還是淺拷貝這種問題不必太過於去深究,我們只要知道它在什麼樣的情景下才能夠使用就行了。

這裏我也提供了一種對象的深拷貝的方法,很簡單:

let newobj = JSON.parse(JSON.stringify(obj));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章