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

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

Что мне не хватает?

4b9b3361

Ответ 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:

введите описание изображения здесь