es7对象扩展表示法如何创建浅拷贝来替换原始对象

How does es7 object spread notational create a shallow copy to replace original object?

本文关键字:对象 创建 浅拷贝 替换 原始 表示 扩展 何创建 es7      更新时间:2023-09-26

我正试图从这里学习Redux以及es7,并且很难理解作者下面关于以下代码的观点:

还要注意,这个ES7对象扩展符号适合我们的示例因为它在做{message: action.value的浅拷贝}超过我们的状态(意思是状态
的第一级属性完全覆盖-而不是优雅地合并-由{message: action的第一级属性。值})。

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

状态的第一级属性是如何被{message: action覆盖的?当作者使用对象扩展表示法时,简单地添加消息:action。值键/值对到原始状态?第一层状态属性仍然存在因为对象扩展符号,对吧?因此,如果原始状态为{a:"foo", b:"bar"},则调度SAY_SOMETHING的动作后的新状态为{a:"foo", b:"bar", message: 'SAY_SOMETHING},对吗?

它只会在替换现有属性时重写。所以,你的例子完全正确。作者提到,它会做一个浅合并,这将覆盖现有的键,但给出了一个例子,只是添加了一个属性,如你所说的。也许发个公关来澄清一下:)

当使用扩展操作符创建新对象时,它的行为与object完全相同。赋值或_。用下划线/虚线扩展,用一个空对象字面值作为第一个参数。所以,这些都是等价的…

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

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

的填充。