Почему этот оператор распространения вызывает SyntaxError: Unexpected token в Node 7.8.0?

Вот фрагмент кода, я сейчас разберу его.

this.argArr = [['arg1', 'arg2'], ['foo', 'bar'], ['you get ', 'the point']];

this.evalArgsFromArr = function () {
  var out = [];
  for (var _ = 0; _ < parent.argArr.length; _++) {
    out.push(someFunction(...parent.argArr[_])); // This part crashes
  }
  return out;
};

Эта функция, конечно же, является частью объекта.

Идея состоит в том, что каждый элемент в parent.argArr должен быть массивом, содержащим два аргумента для someFunction(), которые также удобно служат удобочитаемым сжатием вывода. Насколько я понимаю, при использовании в итерируемом объекте (например, в массивах, хранящихся в parent.argArr) оператор распространения выводит каждое отдельное значение отдельно. (Например, первый запуск цикла for должен вывести someFunction('arg1', 'arg2').)

Всякий раз, когда я запускаю файл, содержащий это, в Node.js или PHP, я получаю SyntaxError: Unexpected token со ссылкой на оператор распространения [...].

Вот сообщение об ошибке, если оно поможет: Сообщение об ошибке

Я использую узел 7.8.0.


person JessLovely    schedule 24.04.2017    source источник
comment
Можете ли вы привести работающий пример?   -  person Leon Aves    schedule 24.04.2017
comment
Какая у вас версия node.js?   -  person Vovan    schedule 24.04.2017
comment
@JessLovely Синтаксические ошибки, такие как неожиданные токены, не являются сбоями. Это ошибка синтаксического анализа, которая обнаруживается еще до того, как ваша программа запускается. Сбои возникают, когда ваша программа компилируется/анализируется нормально, но в процессе выполнения выполняет недопустимую операцию, которая не была предусмотрена движком (например, попытка доступа к свойству с нулевым значением). Я собираюсь отредактировать ваш пост соответствующим образом, чтобы он оставался актуальным для будущих посетителей. Во-вторых, у меня нет проблем с этим, поэтому я не могу воспроизвести проблему — возможно, это просто устаревшая версия Node.   -  person ggorlen    schedule 14.02.2021


Ответы (2)


Я думаю, что это наказание за использование подчеркивания в качестве имени переменной. А если серьезно, глядя на ваш код, кажется, что он должен работать, но только если ваш интерпретатор Node достаточно новый, чтобы его поддерживать.

Чтобы увидеть поддержку оператора распространения в версиях Node, см.:

Чтобы использовать современный синтаксис на платформах, которые изначально его не поддерживают, используйте Babel:

Конечно, мы не можем его протестировать, потому что вы не предоставили работающий пример.

Но вы можете увидеть этот ответ:

и посмотрите, сможете ли вы запустить пример там. Он использует оператор распространения и, если он протестирован, работает правильно. Если он работает в вашей системе, вы сможете использовать оператор распространения. Если это не так, вам действительно следует обновить Node, потому что нет причин использовать такую ​​устаревшую версию.

Если ничего не помогает, вы всегда можете изменить:

someFunction(...array);

to:

someFunction.apply(undefined, array);

См. документы:

Между прочим, я не уверен, что вы имеете в виду, говоря, что одна строка «любит падать» — разве она не всегда падает? Это было бы очень странно.

person rsp    schedule 24.04.2017
comment
У меня Node 7.8.0, так что он должен работать... хм. Я как бы избегаю apply, так как это имеет тенденцию иметь довольно корявые последствия для кода. - person JessLovely; 24.04.2017
comment
@ Papayaman1000 С Node 7.8.0 это должно работать. Если вы предоставили работающий пример, кто-то может сказать вам, что не так. Фрагмент в вашем вопросе не может быть запущен, чтобы воспроизвести вашу ошибку. - person rsp; 24.04.2017
comment
Я не уверен, что предоставить, кроме дампа всего файла. Будет ли это уместно/полезно? - person JessLovely; 24.04.2017

Вы должны удалить "...", попробуйте:

this.argArr = [['arg1', 'arg2'], ['foo', 'bar'], ['you get ', 'the point']];

this.evalArgsFromArr = function () {
  var out = [];
  for (var _ = 0; _ < parent.argArr.length; _++) {
    out.push(someFunction(parent.argArr[_]));
  }
  return out;
};
person Jesús Márquez    schedule 24.04.2017
comment
Как предполагается помещать элементы массива в отдельные аргументы функции с удаленным ...? - person rsp; 24.04.2017
comment
Мне кажется, что сказать, что вы должны удалить ..., в лучшем случае бесполезно, а в худшем — неправильно. Тем более, что в том виде, как вы его пишете, он передает весь массив как один аргумент, а не его компоненты как отдельные аргументы. Именно поэтому я использую оператор распространения в первую очередь. - person JessLovely; 24.04.2017