是否存在Object.assign的不可变版本?

时间:2016-07-27 15:29:41

标签: javascript immutability assign

我想在JavaScript中混合两个对象:

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 }

有没有办法将a分配到b到新对象?

4 个答案:

答案 0 :(得分:17)

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




答案 1 :(得分:8)

您可以使用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);




答案 2 :(得分:4)

最终点差运算符。它有助于添加单个属性,例如在JS中设置CSS样式。但请注意,它目前是EcmaScript的only in stage 4

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

const moreStyle = {...lessStyle, color: 'red'};
// lessStyle is not affected

你今天可以在Typescript和JSX中使用它。

答案 3 :(得分:0)

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

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

你需要在第一个对象的assign方法中使用{},因为如果你在这里阅读Object.assign方法的文档https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Parameters它说明第一个参数是目标对象,其余的是源。所以现在你将b分配给a并将新a返回给c。因此,如果您的第一个参数是空对象,则不会发生这种情况。