Node.js 节点5.10排列操作员不工作

Node.js 节点5.10排列操作员不工作,node.js,ecmascript-6,Node.js,Ecmascript 6,,默认情况下,最新节点(节点5+)应支持spread运算符,如下所示: const newObj = { ...oldObj, newProperty: 1 } 我已经安装了node 5.10.1(例如,'node-v'告诉我的)。但我仍然得到这个错误: c:\[myprojectfolder]>node index.js c:\[myprojectfolder]\index.js:21 ...oldObj,

,默认情况下,最新节点(节点5+)应支持spread运算符,如下所示:

const newObj = {
        ...oldObj,
        newProperty: 1
      }
我已经安装了node 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
我遗漏了什么?

支持数组排列语法,但不支持-这很可能是因为它尚未作为ECMAScript规范的一部分最终确定(它最初计划包含在ES7/ES2016中,但如果我没有记错的话,它被取消了)

同时,您可以选择使用transpiler(例如,与插件一起使用),或者如果这感觉有些过分,您可以使用新的内置功能。对象排列语法实际上就是object.assign周围的语法-问题中的示例可以这样表达:

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


更新:


更新2:对象扩展语法,将成为ES2018规范的一部分。

您尝试使用的称为对象扩展,不属于es2015规范的一部分。节点仅支持函数调用和数组文本中的常规排列。不幸的是,尽管它们链接到使用
,但甚至还不支持数组的分解

您可以改为使用:


这在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调试控制台的屏幕截图:


啊!文件应该真正反映出这种区别。它仅列出支持的“排列运算符”。好的,谢谢!我将使用Object.assign()方法。@batjko-node.js文档丢失了数百万个东西。这是一个有着蹩脚文档的伟大项目。公平地说,link node.js的spread操作符指向了spread的MDN文档,该文档根本没有提到对象spread语法。因此,node.js文档并没有真正说明支持对象扩展语法。你跳到那个结论是因为同一个名字。@batjko:他们真的应该澄清这一点,你是对的@batjko:你通常可以假设提案没有得到实施/支持。@Felix我理解这一点。我不知道的是(因为我没有时间掌握它)对象和数组扩展运算符之间存在差异,而前者仍处于建议阶段。不过我现在知道了。
Old Object: {
    "oldProperty": 0
}
New Object: {
    "oldProperty": 0,
    "newProperty": 1
}