2

我正在尝试从这里学习 Redux 和 es7 ,但无法理解作者关于以下代码的以下观点:

另请注意,此 ES7 对象扩展表示法适合我们的示例,因为它在我们的状态上做 { message: action.value } 的浅拷贝(这意味着状态
的第一级属性被第一级属性完全覆盖 - 而不是优雅地合并 - {消息: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"}调度动作后的新状态,对SAY_SOMETHING{a:"foo", b:"bar", message: 'SAY_SOMETHING}?什么都没有被替换。

4

1 回答 1

1

它只会覆盖它正在替换现有属性的 IFF。所以,你的例子是完全正确的。作者提到它会进行浅合并,这将覆盖现有的键,但给出了一个示例,只是按照您所说的添加了一个属性。也许发送公关澄清:)

当使用扩展运算符创建一个新对象时,它的行为与下划线/Lo-dash 中的Object.assign_.extend完全相同,并以空对象文字作为第一个参数。所以,这些都是等价的……

Object.assign({}, a, b)
_.extend({}, a, b)
{ ...a, ...b }

正如您在Babel REPL中看到的那样,Babel 只是将此语法转换为 Object.assign(如果可用)或 polyfillObject.assign

于 2016-10-03T15:09:47.157 回答