【问题标题】:Node 5.10 spread operator not working节点 5.10 扩展运算符不工作
【发布时间】:2016-08-08 13:33:36
【问题描述】:

According to the docs,最新的节点(Node 5+)应该默认支持展开算子,像这样:

const newObj = {
        ...oldObj,
        newProperty: 1
      }

我安装了节点 5.10.1(例如,这就是“节点 -v”告诉我的内容)。但我仍然收到此错误:

c:\[myprojectfolder]>node index.js
c:\[myprojectfolder]\index.js:21
            ...oldObj,
            ^^^

SyntaxError: Unexpected token ...
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:146:18)
    at node.js:404:3

我错过了什么?

【问题讨论】:

    标签: node.js ecmascript-6


    【解决方案1】:

    支持 array 扩展语法,但不支持 object spread syntax - 这很可能是因为它尚未最终确定为 ECMAScript 规范的一部分(最初计划包含在ES7/ES2016,但如果我没记错的话,它被撞了回来)。

    与此同时,您的选择是使用转译器(例如Babel,带有transform-object-rest-spread 插件),或者如果感觉有点过头了,您可以使用新的内置Object.assign 函数。对象传播语法实际上只是围绕 Object.assign 的语法糖 - 您问题中的示例可以这样表达:

    const newObj = Object.assign({}, oldObj, {
        newProperty: 1
    });
    

    注意空对象作为第一个参数;其余传递对象的属性被合并到其中,函数调用最右边的属性优先。简单地将oldObj 作为第一个参数似乎更直观,但这并没有完全相同的效果——它会改变现有的oldObj 并返回它。将空对象作为目标使 oldObj 保持不变。


    更新: As of Node 8.6, object spread syntax is supported.

    更新 2: 对象扩展语法 has finally made its way through the proposal process,将成为 ES2018 规范的一部分。

    【讨论】:

    • 啊!文档应该真正反映这种区别。它仅列出支持的“扩展运算符”。好的谢谢!我将使用 Object.assign() 方法。
    • @batjko - node.js 文档丢失了数以百万计的东西。这是一个带有糟糕文档的伟大项目。公平地说,node.js 的传播运算符的链接指向 MDN 的传播文档,其中根本没有提到对象传播语法。因此,node.js 文档并没有真正说支持对象传播语法。由于同名,您有点跳到这个结论。
    • @batjko:他们真的应该澄清这一点,你是对的!
    • @batjko:您通常可以假设 proposals 没有实施/支持。
    • @Felix 我明白这一点。我不知道(因为我没有时间掌握它)是对象和数组扩展运算符之间存在差异,而前者仍处于提案阶段。不过我现在知道了。
    【解决方案2】:

    这适用于 Node.js 8.5.0。

    例子:

    var oldObj = {
        oldProperty: 0
    }
    
    var newObj = {
        ...oldObj,
        newProperty: 1
    }
    
    console.log('Old Object: ' + JSON.stringify(oldObj, null, '    '))
    
    console.log('New Object: ' + JSON.stringify(newObj, null, '    '))
    

    输出:

    Old Object: {
        "oldProperty": 0
    }
    New Object: {
        "oldProperty": 0,
        "newProperty": 1
    }
    

    IDE 调试控制台的屏幕截图:

    【讨论】:

      【解决方案3】:

      您尝试使用的称为object spread,它不是 es2015 规范的一部分。 Node 仅支持函数调用和数组字面量中的常规展开。不幸的是,甚至还不支持数组解构,尽管它们链接到 the MDN page which describes both structuring and destructuring 使用 ...

      您可以改用Object.assign

      const newObj = Object.assign({}, oldObj, {
        newProperty: 1
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2020-07-27
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多