2016-07-27 43 views
3

我想在JavaScript混合兩個對象:是否存在Object.assign的不可變版本?

let a = {x: 1, y: 2, z:3}; 
let b = {x:10, y: 20}; 

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

這提供了正確的價值c

Object { x: 10, y: 20, z: 3 } 

但現在a已被修改過!

Object { x: 10, y: 20, z: 3 } 

是否有分配ab到一個新的對象的方法嗎?

回答

7

的第一個參數assign目標。所以它會改變。你可以簡單地傳遞一個空的對象爲你的目標,如果你不希望任何的來源發生變化:

let a = {x: 1, y: 2, z:3}; 
 
let b = {x:10, y: 20}; 
 

 
let c = Object.assign({},a, b); 
 
console.log(c); 
 
console.log(a); // a is unchanged

6

您可以使用spread operator

let a = {x: 1, y: 2, z: 3}; 
 
let b = {x: 10, y: 20}; 
 

 
let c = { 
 
    ...a, 
 
    ...b 
 
} 
 

 
console.log(c); 
 
console.log(a);

+0

擴散運算符是一件美麗的事情。 Babel插件:https://babeljs.io/docs/plugins/transform-object-rest-spread/ – sdgfsdh

0
let a = {x: 1, y: 2, z:3}; 
let b = {x:10, y: 20}; 

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

您需要{}的分配方法中第一個對象,因爲如果你在這裏閱讀Object.assign方法的文檔https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Parameters它指出第一個參數是目標對象,其餘的是源。所以現在你將b分配給a並將新的a返回給c。所以如果你的第一個參數是一個空對象,這不會發生。

1

明確地說,傳播運營商。它有助於添加單個屬性,如在JS中對CSS進行樣式化。但請注意,它目前是EcmaScript的only in stage 3

const lessStyle = { 
    color: 'blue', 
    backgroundColor: 'yellow' 
}; 

const moreStyle = {...lessStyle, color: 'red'}; 
相關問題