节点5.10传播运营商不工作

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

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

并且我已经安装了节点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中,但是它被反弹了,如果我记得正确)。

在此期间,您的select是使用转换器(例如Babel ,使用transform-object-rest-spread插件),或者如果感觉过度使用,您可以使用新的内置Object.assign函数。 对象的扩展语法实际上就是Object.assign附近的语法糖 – 你的问题中的例子可以这样expression:

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

注意空对象作为第一个参数; 来自剩余的对象的属性被合并到其中,而函数调用的最右边的那些属性优先。 简单地将oldObj作为第一个参数看起来可能更直观,但是这并不具有完全相同的效果 – 它会改变现有的oldObj并将其返回。 拥有一个空对象作为目标离开oldObj不变。


更新: 自节点8.6开始,支持对象扩展语法。

你试图使用的是所谓的对象传播 ,不是es2015规范的一部分。 节点只支持函数调用和数组文字中的常规传播。 不幸的是,即使支持数组解构也没有被支持,尽pipe它们链接到MDN页面,该页面描述了…的结构化和解构化的使用。

你可以使用Object.assign来代替:

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

这是在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 } 

IDEdebugging控制台的屏幕截图:

在这里输入图像描述