Подтвердить что ты не робот

Node v6 сбой при распространении объекта

У меня возник вопрос о том, почему node v6.7 не сможет запустить этот код:

var a = {
    foo: 'bar'
}

var b = {
    ...a,
    my: 'sharona'
}
console.log(b)

У кого-нибудь есть идея, почему это было бы? Я думал, что 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
4b9b3361

Ответ 1

Похоже, что оператор распространения ES6 работает только для массивов и итераций. Он специально разработан для НЕ РАБОТАЕТ для объектов: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator

Соответствующая цитата:

Только для итераций

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

Хотя статья MDN предполагает, что попытка использования оператора спреда для объектов должна приводить к undefined вместо того, чтобы бросать ошибку.

Кроме того, требования к таблице совместимости node.js node.js полностью соответствуют спецификации оператора с расширением с массивами и итерами, но в частности указывает, что свойства останова/распространения объекта не поддерживаются: http://node.green/#ESNEXT-candidate--stage-3--object-rest-spread-properties

Ответ 2

Использование rest/spread с объектами - это отдельное предложение, которое вы можете прочитать здесь здесь. Предложение не принимается к ежегодному выпуску ES, если оно не достигло стадии 4, и на данный момент это этап 3. Он может попасть в ES2018. Если вы хотите использовать его сейчас, вам придется использовать транспилер, например babel.


РЕДАКТИРОВАТЬ: Как и в случае с Node v8.3, объект rest/spread доступен без необходимости какой-либо трансляции.