节点5.10扩展运算符无法正常工作

28
根据文档,最新的 Node(Node 5+)应默认支持扩展操作符,如下所示:

According to the docs,the latest node (Node 5+) should support the spread operator by default, like so:

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

我错过了什么?

3个回答

51

数组展开语法被支持,但是对象展开语法不被支持 - 这很可能是因为它尚未作为ECMAScript规范的一部分最终确定(据我回忆,它最初计划包含在ES7 / ES2016中,但被推迟了)。

与此同时,您有两个选项:使用转译器(例如Babel,带有transform-object-rest-spread插件),或者如果感觉过于复杂,可以使用新的内置Object.assign函数。实际上,对象展开语法就是围绕Object.assign的语法糖 - 您问题中的示例可以表达如下:

const newObj = Object.assign({}, oldObj, {
    newProperty: 1
});
注意传入的第一个参数是空对象;其余传入的对象属性会被合并到它里面,函数调用时在最右边的对象属性具有最高优先级。尽管将oldObj作为第一个参数可能更直观,但这样做并不能产生相同的效果——它不仅会修改现有的oldObj,而且还会返回它。将空对象作为目标保留了oldObj的原始值。


更新:自Node 8.6起,支持对象扩展语法。

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


4
啊!文档应该真正反映出这种区别。它只列出了“展开运算符”作为被支持的内容。好的,谢谢!我会使用Object.assign()方法。 - batjko
2
@batjko - node.js文档缺失了数百万个东西。这是一个伟大的项目,但文档很糟糕。公平地说,node.js链接到spread运算符的MDN文档并没有提到对象spread语法。因此,node.js文档并没有真正说明支持对象spread语法。你之所以得出这个结论,是因为它们有相同的名称。 - jfriend00
1
@batjko:他们确实应该澄清这一点,你说得对! - Joe Clay
@batjko: 通常可以假设提案未被实现/支持。 - Felix Kling
2
@Felix 我理解。我不知道的是(因为我没有时间跟进),对象和数组展开操作符之间有一个区别,而前者仍处于提案阶段。不过现在我知道了。 - batjko

3
你尝试使用的是称为对象展开的内容,它不是es2015规范的一部分。Node仅支持函数调用和数组字面量中的常规展开。不幸的是,甚至还不支持数组解构,尽管它们链接到描述结构和解构的MDN页面使用...
相反,您可以使用Object.assign
const newObj = Object.assign({}, oldObj, {
  newProperty: 1
});

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
}

IDE调试控制台截图:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接