节点5.10传播运算符不工作

bat*_*jko 28 node.js ecmascript-6

根据文档,最新节点(节点5+)默认应支持扩展运算符,如下所示:

const newObj = {
        ...oldObj,
        newProperty: 1
      }
Run Code Online (Sandbox Code Playgroud)

我安装了节点5.10.1(例如'node -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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Joe*_*lay 50

阵列蔓延语法都是支持的,但对象传播语法是不是-这是最有可能是由于它没有被最终确定为ECMAScript的规范的一部分,但(这是原计划纳入ES7/ES2016,但它得到了被撞回,如果我没记错的话).

同时你的选择是使用一个转换器(例如Babel,使用transform-object-rest-spread插件),或者如果感觉有点过分,你可以使用新的内置Object.assign函数.对象扩展语法实际上只是围绕Object.assign的语法糖 - 你问题中的例子可以这样表达:

const newObj = Object.assign({}, oldObj, {
    newProperty: 1
});
Run Code Online (Sandbox Code Playgroud)

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


更新: 从Node 8.6开始,支持对象扩展语法.

更新2:对象扩展语法最终完成了提案流程,并将成为ES2018规范的一部分.

  • 啊! 文档应该真正反映出这种区别.它仅列出支持的"Spread operator".好的谢谢!我将使用Object.assign()方法. (4认同)
  • @batjko - node.js文档缺少数百万个东西.这是一个很棒的项目,包含糟糕的文档.公平地说,链接node.js为扩展运算符指向扩展的MDN文档,它根本没有提到对象扩​​展语法.因此,node.js doc并没有真正说支持对象扩展语法.由于同名,你有点跳到那个结论. (2认同)
  • @Felix我明白了.我没有意识到的(因为我没有时间留在它上面)是对象和数组扩展运算符之间存在差异,而前者仍处于提案阶段.不过我现在知道了. (2认同)