2011-11-12 10 views
18

Jak muszę zmodyfikować te linie, aby jshint był szczęśliwy?Dlaczego jshint nie rozpoznaje przypisania jako wyrażenia?

Przypisanie jest wyrażeniem. Dlaczego jshint nie rozumie tego? Oczywiście, że tłumacz.

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. 
+0

Jak rzucić do bool? –

Odpowiedz

19

Jeśli naprawdę chcesz słuchać JSHint, konwertowanie wyrażenie do wartości logicznej przez:

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. 

Więc !! oznacza: Konwersja coś do reprezentacji warunkowej.

+0

Najprostszy ... więc poszedłem z tym. –

+0

czy javascipt ma obsadę typu bool of sorts ... coś bardziej bezpośredniego? –

+0

@ stack.user.0 Bardziej bezpośredni niż '!! '? To jest tak bezpośrednie, jak to tylko możliwe: JavaScript ma prawdę/falsy, jeśli chcesz prawdziwego boolowskiego, '!!' jest twoim najłatwiejszym zakładem. –

19
/*jshint boss:true */ 

Eksperymentuj z options.

13

Jestem pewien, że jshint rozumie wyrażenie dobrze, po prostu większość ludzi, którzy piszą if (a = b), faktycznie oznacza if (a == b), a to generuje ostrzeżenie.

Ponieważ kod jest co zamierzałeś można dodać wyraźnie Test:

while ((element_iterator = element_iterator.nextSibling) !== null) { ... } 
0

Jest wyrazem i można go zmodyfikować, aby pracować z JSHint (chociaż to nie jest miłe) tak:

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

Dla Twojego ostatniego przykładu. Jednak nie musisz tego robić. JSHint to tylko narzędzie, które pomoże ci ulepszyć nawyki dotyczące kodowania i poprawić błędy, ale biorąc pod uwagę, że to, co masz, jest jasne, zwięzłe i (moim zdaniem) najlepszy sposób robienia tego - po prostu zignoruj ​​te wiadomości.

0

jshint nie może stwierdzić, czy naprawdę chciałeś wykonać zadanie w bloku warunku, czy też rzeczywiście miało to być porównanie. Obawiano się, że inni ludzie mogą mieć takie same wątpliwości.

W przypadku iteratora, myślę, że wszystko w porządku.

0

miałem ten błąd, bo miałem z tyłu przecinek w deklaracji poprzedzających funkcję:

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

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

(trudno było znaleźć, ale wzmacnia moją opinię, że Linters są zwykle rację, to jest mój kod, który jest źle Gdybym wyłączył ostrzeżeń globalnie. - lub nawet w tym miejscu - bug nadal byłby obecny </lecture>)

+0

To nie jest to samo ostrzeżenie, co w tym pytaniu. To jest [W030] (https://github.com/jshint/jshint/blob/78b79c099fc490d93cd7aef599a1528761e9498d/src/messages.js#L112), a pytanie dotyczy [W084] (https://github.com/jshint/jshint /blob/78b79c099fc490d93cd7aef599a1528761e9498d/src/messages.js#L171). Podobny nie ma tu znaczenia. –

3

Istnieją co najmniej dwa sposoby, aby rozwiązać zgłoszony problem, według JSHint docs..

  1. Dodaj /*jshint boss:true */ przed instrukcją warunkową
  2. Wrap oświadczenie w dodatkowych nawiasach, tj while ((element_iterator = element_iterator.nextSibling)) {...}

Osobiście uważam, że otaczający z dodatkowych nawiasach jest najlepsza praktyka, ponieważ utrzymuje kontrolę błędów, ale nadal ma sens pod względem kodu. Dodanie do tego !! w rzeczywistości niczego nie zmienia, lecz przekształca wyrażenie na true/false dwa razy.

+0

Warto jednak zauważyć, że ostrzeżenie o "zmiennym cieniu", szczególnie w przypadku pętli for. odnośnik: http://jshint.com/docs/options/#shadow – PageYe

Powiązane problemy