节点v6在对象传播上失败

maj*_*mer 55 node.js ecmascript-6

我有一个问题,为什么节点v6.7将无法运行此代码:

var a = {
    foo: 'bar'
}

var b = {
    ...a,
    my: 'sharona'
}
console.log(b)
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么会这样?我以为v6支持对象传播..?但我想不是吗?这是我看到的错误:

/home/teselagen/ve/tnrtest.js:6
    ...a,
    ^^^
SyntaxError: Unexpected token ...
    at Object.exports.runInThisContext (vm.js:76:16)
    at Module._compile (module.js:528:28)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3
Run Code Online (Sandbox Code Playgroud)

saa*_*adq 57

使用rest/spread with objects是一个单独的提议,您可以在这里阅读.除非提交到第4阶段,否则提议不会被接受为年度ES发布,并且它现在是第3阶段.它可能会进入ES2018.如果你现在想要使用它,你将不得不使用像这样的转换器babel.


编辑:从Node v8.3开始,对象休息/传播可用,无需任何转换.

  • 我有节点8.6但仍有问题 (2认同)

sle*_*man 48

看起来ES6扩展运算符仅适用于数组和迭代.它专门设计为用于对象:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator

相关报价:

仅适用于iterables

var obj = {"key1":"value1"};
function myFunction(x) {
    console.log(x); // undefined
}
myFunction(...obj);
var args = [...obj];
console.log(args, args.length) //[] 0
Run Code Online (Sandbox Code Playgroud)

虽然MDN文章之前曾建议尝试在对象上使用spread运算符应该导致undefined而不是抛出错误.在本次修订中,当前的MDN文章讨论了对"Spread for object literals"的支持

此外,node.js兼容性表声称node.js完全符合带有数组和迭代的扩展运算符的规范,但具体表明不支持对象rest/spread属性:http://node.green/#ESNEXT-candidate --stage-3 - object-rest-spread-properties,至少在Node版本8.60之前(此时颜色变为绿色表示从8.3开始,Node 确实支持对象传播/休息操作符,如指出在另一个答案)

  • 这已经过时了.对象传播在现代浏览器中起作用,并且在节点8中 (6认同)