Node Оператор с расширением 5.10 не работает
В соответствии с документами последний node (Node 5+) должен поддерживать оператор распространения по умолчанию, например:
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
Что мне не хватает?
Ответы
Ответ 1
Поддерживается синтаксис распространения массива, но синтаксис распространения объектов - это, скорее всего, из-за того, что он не завершается как часть от спецификации 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
То, что вы пытались использовать, называется распределением объектов и не является частью спецификации es2015. Node поддерживает только регулярное распространение вызовов функций и литералов массива. К сожалению, пока еще не поддерживается деструктуризация массива, хотя они ссылаются на страницу MDN, которая описывает как структурирование, так и деструктурирование, используя ...
.
Вместо Object.assign
можно использовать
const newObj = Object.assign({}, oldObj, {
newProperty: 1
});
Ответ 3
Это работает в 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:
![введите описание изображения здесь]()