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

问题描述 投票:6回答:4

我想在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上新的对象?

javascript immutability assign
4个回答
18
投票

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

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

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中使用它。


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。因此,如果您的第一个参数是空对象,则不会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.