我正在尝试从 here 学习 Redux 和 es7并且无法理解作者关于以下代码的观点:
Note also that this ES7 Object Spread notation suits our example because it's doing a shallow copy of { message: action.value } over our state (meaning that first level properties of state
are completely overwritten - as opposed to gracefully merged - by first level property of { message: action.value }).
var reducer_3 = function (state = {}, action) {
console.log('reducer_3 was called with state', state, 'and action', action)
switch (action.type) {
case 'SAY_SOMETHING':
return {
...state,
message: action.value
}
default:
return state;
}
}
当作者使用 Object Spread 表示法简单地添加 message: action.value 键/值对到原始状态时,状态的第一级属性如何被 {message: action.value} 覆盖状态?由于 Object Spread 表示法,状态的第一级属性仍然存在,对吗?因此,如果原始状态是 {a:"foo", b:"bar"}
,则在分派(dispatch) SAY_SOMETHING
操作后的新状态将是 {a :"foo", b:"bar", message: 'SAY_SOMETHING}
,正确吗?没有任何东西被替换。
最佳答案
它只会覆盖 IFF 它正在替换现有属性。所以,你的例子是完全正确的。作者提到它会进行浅合并,这将覆盖现有的键,但给出了一个简单地添加属性的示例,如您所说。也许发送 PR 来澄清 :)
当使用扩展运算符创建一个新对象时,它的行为与Object.assign 完全一样。或 _.extend在 Underscore/Lo-dash 中使用空对象文字作为第一个参数。所以,这些都是等价的……
Object.assign({}, a, b)
_.extend({}, a, b)
{ ...a, ...b }
正如您在 Babel REPL 中看到的那样,Babel 简单地将此语法转换为 Object.assign
(如果可用)或 Object.assign
关于javascript - es7 object spread notational 如何创建一个浅拷贝来替换原始对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948899/