JavaScript: ожидалось и присваивание или вызов функции, а вместо этого увидел выражение

Я использую JSHint, чтобы убедиться, что мой JavaScript является «строгим», и я получаю следующую ошибку:

Ожидал присваивания или вызова функции, а вместо этого увидел выражение

В следующем коде:

      var str = 'A=B|C=D'
      var data = {};
      var strArr = str.split( '|' );
      for (var i = 0; i < strArr.length; i++) {
          var a = strArr[i].split('=');
          a[1] && (data[a[0].toLowerCase()] = a[1]);  // Warning from JSHint
      } 

Любые идеи, почему я получаю такую ​​​​ошибку или как я могу кодировать, чтобы удалить ошибку.


person HSG    schedule 20.04.2014    source источник
comment
что вы пытаетесь сделать с последней строкой?   -  person attila    schedule 20.04.2014
comment
мне кажется, что вы присваиваете (data[a[0].toLowerCase()] = a[1]) вместо сравнения (data[a[0].toLowerCase()] == a[1]).   -  person Adelin    schedule 20.04.2014
comment
код пытается проанализировать строку и преобразовать ее в объект. Например, «ABC=XYZ». Ожидаемый результат: data.abc = xyz.   -  person HSG    schedule 20.04.2014
comment
Последняя строка выглядит запутанной, вы все равно могли бы переписать ее яснее.   -  person Evan Trimboli    schedule 20.04.2014


Ответы (2)


Вот упрощенная версия с тем же предупреждением:

var a, b;
a && (b = a);

Ожидал присваивания или вызова функции, а вместо этого увидел выражение

Это означает, что у вас есть выражение, но вы не присваиваете результат какой-либо переменной. jshint не заботит фактическое выражение или наличие побочных эффектов. Даже если вы что-то присваиваете внутри выражения, вы все равно игнорируете результат выражения.

Есть еще одна ошибка jslint, если вам это небезразлично:

Неожиданное выражение присваивания

Это предупреждает вас о том, что вы можете использовать == вместо = внутри логических выражений. Это распространенная ошибка, поэтому вам не рекомендуется использовать присваивания в логических выражениях (хотя это именно то, что вам здесь нужно).

По сути, jshint/jslint не любит неправильного использования сокращенной оценки логического оператора в качестве замены операторов if. Предполагается, что если результат выражения не используется, то, вероятно, это не должно быть выражением.

person kapex    schedule 20.04.2014
comment
Спасибо. Я разделил левую часть на отдельную строку для сравнения и присваивания внутри if. if (a[1] !== null ) { dataObj[a[0].toLowerCase()] = a[1]; } - person HSG; 20.04.2014

http://jshint.com/docs/options/#expr — JSHINT говорит, предупреждения Expr являются частью расслабляющих вариантов. Итак, если вы напишете /* jshint expr: true */, это не даст вам предупреждения. Но вы также должны знать объем функций. Если вы просто наберете эту строку поверх всего, это правило будет применяться глобально. Таким образом, даже если вы допустили ошибку в других строках, jshint ее проигнорирует. Итак, убедитесь, что вы используете это с умом. Попробуйте использовать if для конкретной функции (я имею в виду только одну функцию)

person Jigar    schedule 17.09.2015