javascript - es7 object spread notational 如何创建一个浅拷贝来替换原始对象?

标签 javascript reactjs redux ecmascript-next

我正在尝试从 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

的 polyfill

关于javascript - es7 object spread notational 如何创建一个浅拷贝来替换原始对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948899/

相关文章:

reactjs - 如何在 django 中从 s3 加载 react 静态文件 - react

reactjs - 如何在 react tsx 导入中包含命名空间?

node.js - 用于启动前端和后端进行调试的 VS Code 设置

javascript - react : Inline if doesn't resolve to false when value is 'undefined'

javascript - jQuery 无法将 Sortable 与同位素一起使用

javascript - 使用 JavaScript 正则表达式查找所有 `*.html` 但不包括 `*.tmp.html`

javascript - 如何在 JavaScript 中将 UTF8 字符编码为 Base64

javascript - Sublime Text 3,使用JS的语法解析和TS的自动补全

javascript - 我应该在 react 组件或 redux Action 中获取数据吗?

reactjs - React/Redux : Action dispatched, 状态未更新