2016-07-27 28 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'}; 
相关问题