According to the docs,默认情况下,最新节点(节点5+)应支持扩展运算符,如下所示:
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
我错过了什么?
答案 0 :(得分:50)
支持数组扩展语法,但object spread syntax不支持 - 这很可能是因为它尚未最终确定为ECMAScript规范的一部分(原本计划用于包含在ES7 / ES2016中,但如果我没记错的话,它会被反击。)
在此期间您的选项要么使用转换器(例如Babel,使用transform-object-rest-spread插件),要么感觉有点矫枉过正,您可以使用新的内置{{ 3}}功能。对象扩展语法实际上只是围绕Object.assign的语法糖 - 你问题中的例子可以这样表达:
const newObj = Object.assign({}, oldObj, {
newProperty: 1
});
注意空对象作为第一个参数;其余传递对象的属性合并到其中,函数调用右侧最远的属性优先。简单地将oldObj
作为第一个参数似乎更直观,但这不会产生完全相同的效果 - 它会改变现有的oldObj
并返回它。将空对象作为目标会使oldObj
保持不变。
更新: Object.assign
更新2:对象传播语法As of Node 8.6, object spread syntax is supported.,并将成为ES2018规范的一部分。
答案 1 :(得分:3)
您尝试使用的内容称为对象传播,不属于es2015规范。 Node仅支持函数调用和数组文字中的常规扩展。遗憾的是,即使支持数组解构,它们仍然会...
使用const newObj = Object.assign({}, oldObj, {
newProperty: 1
});
链接。
您可以改为使用for example:
{{1}}
答案 2 :(得分:1)