вызов forEach () не компилируется - PullRequest
0 голосов
/ 07 июня 2019

Следующая часть кода правильно компилируется с Vue CLI 2, но в моем проекте Nuxt это не так:

// Populate row with times + total of times at the end of the row
let total = 0
['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'].forEach(day => {
  const temp = weekTimes.find(x => x.date === this[day])
  if (temp) {
    this[day + 'Time'] = temp.hours
    total += parseInt(temp.hours)
  } else {
    this[day + 'Time'] = ''
  }
})

Третья строка (['mon', 'tue'...) связана со следующими ошибками компиляции:

Ожидается отступ в 12 пробелов, но найдено 10 неожиданных символов новой строки между объектом и [доступа к свойству

Неожиданное использование оператора запятой

Ожидаемые скобки вокруг аргумента функции стрелки, имеющие тело фигурные скобки

Тем не менее, это действительный код ES6, так почему у компилятора с ним проблемы?

1 Ответ

1 голос
/ 08 июня 2019

Опасности пропуска точек с запятой.

Это:

let total = 0
['mon', 'tue'].forEach(day => {

будет трактоваться следующим образом:

let total = 0['mon', 'tue'].forEach(day => {

Часть 0[...] будетрассматривается как попытка доступа к свойству со значением 0.Попробуйте запустить этот пример в консоли браузера:

0['toFixed'](2)

Это просто способ вызова метода toFixed для значения 0 с передачей аргумента 2.

ЗапятаяОператорская часть ошибки относится к разделу 'mon', 'tue'.Попробуйте набрать это в своей консоли:

'mon', 'tue'

Хотя оператор запятой подобный редко используется, вы должны обнаружить, что он вычисляется до последнего значения, поэтому 'tue' в этом случае.Итак, используя мой предыдущий пример, он выглядит примерно так:

0['toString', 'toFixed'](2)

Здесь toString фактически игнорируется и просто вызывает toFixed, как в моем предыдущем примере.Линтеры будут проверять такое использование запятых, поскольку они почти всегда являются результатом неверной интерпретации запятой.Как и в вашем случае, обычно предполагается, что он является разделителем в массиве, а не оператором запятой.

Итак, вернемся к вашему коду:

let total = 0
['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'].forEach(day => {

будет пытаться получить доступ к 'sun' свойство значения 0, которое будет undefined.Затем он попытается вызвать метод forEach для undefined, что приведет к ошибке.

Таким образом, пока ваш код верен, он не будет работать должным образом.Линтер замечает эти ошибки и пытается помочь вам исправить их.

Самое простое решение - вставить точку с запятой.

Это предупреждение:

Ожидаемые круглые скобки вокруг аргумента функции стрелки, имеющие тело с фигурными скобками

- это всего лишь правило ограничения.Ожидается, что вы напишите .forEach(day => { как .forEach((day) => {.С точки зрения корректности в коде нет ничего плохого, на самом деле это всего лишь линтер, навязывающий предпочтения стиля кода.

...