Почему jshint не распознает назначение как выражение? - PullRequest
19 голосов
/ 13 ноября 2011

Как мне нужно изменить эти строки, чтобы сделать jshint счастливым?

Присвоение является выражением. Почему jshint этого не понимает? Очевидно, что переводчик делает.

Line 572: while(bookmark_element=bookmark_list[iterator++])

Expected a conditional expression and instead saw an assignment.


Line 582: while(bookmark_element=bookmark_list[iterator++])

Expected a conditional expression and instead saw an assignment.


Line 623: while(element_iterator=element_iterator.nextSibling)

Expected a conditional expression and instead saw an assignment.

Ответы [ 8 ]

20 голосов
/ 13 ноября 2011

Если вы действительно хотите слушать JSHint, преобразуйте выражение в логическое значение следующим образом:

while (!!(bookmark_element=bookmark_list[iterator++]))

! means: Something that evaluates to true is converted to false,
         something that evaluates to false is converted to true.

Итак, !! означает: преобразовать что-либо в условное представление.

19 голосов
/ 13 ноября 2011
/*jshint boss:true */

Эксперимент с параметрами .

13 голосов
/ 13 ноября 2011

Я уверен, что jshint прекрасно понимает выражение, просто большинство людей, которые пишут if (a = b), на самом деле имели в виду if (a == b), и поэтому выдается предупреждение.

Поскольку ваш код - то, что вы намеревалисьВы можете добавить явный тест:

while ((element_iterator = element_iterator.nextSibling) !== null) { ... }
4 голосов
/ 12 июля 2016

Существует, по крайней мере, два способа решения сообщенной ошибки, согласно Документам JSHint .

  1. Добавить /*jshint boss:true */ перед условным оператором
  2. Оператор переносав дополнительных скобках, т. е. while ((element_iterator = element_iterator.nextSibling)) {...}

Лично я считаю, что окружение дополнительными скобками является наилучшей практикой, поскольку оно сохраняет проверку на наличие ошибок, но все же имеет смысл с точки зрения кода.Добавление !! before фактически ничего не делает, кроме преобразования выражения в true / false вперед и назад два дополнительных раза.

0 голосов
/ 11 июля 2018

Добавьте /* jshint expr: true */ комментарий в ваш файл Javascript, он больше не будет отображать предупреждение.

0 голосов
/ 15 декабря 2015

У меня была эта ошибка, потому что у меня была запятая в объявлении, предшествующем функции:

this.foo = "bar",   // <- Error was here

this.myfunc = function() {
   ...   // <- Error reported on this line
};

(Трудно было найти, но подтверждает мое мнение, что линтеры, как правило, правильные, это мой код, который неправильный. Если бы я отключил предупреждения глобально - или даже в этом месте - ошибка все еще присутствовала бы . </lecture>)

0 голосов
/ 13 ноября 2011

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

В случае итератора, я думаю, вы в порядке.

0 голосов
/ 13 ноября 2011

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

while(element_iterator.nextSibling) {
    element_iterator = element_iterator.nextSibling;

Для вашего последнего примера. Тем не менее, вам не нужно делать это. JSHint - это всего лишь инструмент, который поможет вам улучшить навыки кодирования и исправить ошибки, но, учитывая, что то, что у вас есть, ясно, сжато и (на мой взгляд) лучший способ сделать это - просто игнорируйте эти сообщения.

...