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
Ответы
Ответ 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 доступен без необходимости какой-либо трансляции.