我正在学习反应和终极版。我想找出这两个代码之间的区别。
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 }) ]
}
}
}
答案 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
适用于原始类型(string
,number
,boolean
以获取最重要的类型),因为它们都是不可变类型(无法更改) 。 Object.assign
不会创建新的引用类型实例,例如Array
,Function
,Object
,null
,undefined
。
示例:
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