{something:value}&之间有什么区别? Object.assign({},{something:value})

时间:2017-02-19 18:05:07

标签: javascript

我正在学习反应和终极版。我想找出这两个代码之间的区别。

export default function xReducer (state = [], action) {
    switch (action.type) {
        // I am simply assigning my key value to the action property
        case 'SOMETHING': {
             return [ ...state, { myKey: action.x } ]
        }
        // I am using Object.assign
        case 'SOMEMORE': {
             return [ ...state, Object.assign({}, { myKey: action.x }) ]
        }
    }
}

2 个答案:

答案 0 :(得分:3)

据我所知,在这个特定的例子中,没有区别。您可以使用Object.assign组合可能存在重叠键的多个对象,这样右侧对象中这些键的值将覆盖左侧对象中的值。规范的例子是这样的:

let options = Object.assign({}, defaultOptions, passedOptions)

在这种情况下,由于合并的唯一对象是空对象和单个文字对象,因此结果与文字对象相同。

答案 1 :(得分:1)

在您的示例中使用Object.assign没有任何好处。 Object.assign创建一个浅表副本。基本上使用Object.assign将创建一个对象的新实例,保持原始对象不变。在React术语中,关键在于保持对象不可变。

var obj1 = {prop1: "A"};
var obj2 = Object.assign({}, obj1);
obj1 === obj2; //false as they are 2 different instances

这可以通过以下方式实现:

var obj2 = {
  prop1: obj1.prop1
};
obj1 === obj2; //false as they are 2 different instances

请注意,Object.assign适用于原始类型(stringnumberboolean以获取最重要的类型),因为它们都是不可变类型(无法更改) 。 Object.assign不会创建新的引用类型实例,例如ArrayFunctionObjectnullundefined

示例:

var obj3 = {
  fn: function() {}
};

var obj4 = Object.assign({}, obj3);
obj3.fn === obj4.fn; //true as Object.assign will not create a new instance of fn

如果使用得当,Object.assign功能多样且功能强大。

请参阅Mozilla的页面:https://developer.mozilla.org/en-US/docs/Glossary/Primitive