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));