Ostatnio uruchamiałem część mojego kodu przez JSLint, kiedy wpadłem na ten błąd. Uważam jednak, że zabawne w tym błędzie jest to, że automatycznie zakłada, że all == powinno być ===.
Czy to naprawdę ma sens? Widziałem wiele przypadków, w których nie chciałbyś porównywać typów i obawiam się, że może to faktycznie powodować problemy.
Słowo „Oczekiwany” sugerowałoby, że powinno się to robić KAŻDY raz ..... To nie ma dla mnie sensu.
javascript
jslint
Metropolia
źródło
źródło
myVar == null
czek, tak, duże zmiany. ; ^) Argument Crockforda jest taki, że uściślił znaczenie kodu i trudno się z tym spierać.Odpowiedzi:
IMO, używanie na ślepo
===
, bez próby zrozumienia, jak działa konwersja typów , nie ma większego sensu.Główna obawa związana z operatorem Equals
==
polega na tym, że reguły porównania w zależności od porównywanych typów mogą sprawić, że operator będzie nieprzechodni, na przykład, jeśli:Naprawdę nie gwarantuje, że:
Na przykład:
'0' == 0; // true 0 == ''; // true '0' == ''; // false
Operator Strict Equals
===
nie jest konieczny, gdy porównujesz wartości tego samego typu, najczęstszy przykład:if (typeof foo == "function") { //.. }
Porównujemy wynik
typeof
operatora, który zawsze jest ciągiem , z literałem ciągu ...Lub kiedy znasz reguły wymuszania typów, na przykład sprawdź, czy coś jest,
null
czyundefined
coś:if (foo == null) { // foo is null or undefined } // Vs. the following non-sense version: if (foo === null || typeof foo === "undefined") { // foo is null or undefined }
źródło
===
operatora jest przejrzystość kodu. Nie ma rozsądnej sytuacji do wykorzystania,==
ponieważ nigdy nie będzie ona tak jasna i zrozumiała jak operator tożsamości. Nie chodzi o to, czy rozumiesz operatory, czy nie, chodzi o użycie tego, który sprawia, że twój kod jest łatwiejszy do odczytania prawie bez żadnych kosztów. Jedynymi programistami, którzy spierają się przeciwko operatorowi tożsamości, są programiści indywidualni i osoby, które nie pracują w zespołach. Z definicji ludzie, których kod nie jest sprawdzany przez wystarczającą liczbę oczu.there is no reasonable situation
jest to rażące zniekształcenie. Pomyśl o (natywnych) typach JavaScriptNumber
iString
. Ich istnienie dowodzi, że autorzy JavaScript mieli na myśli określone przypadki użycia==
. Czy naprawdę uważasz, żenew String('hi') === 'hi'
ocenianiefalse
jest bardzo jasne? Napisz fragment kodu, który przetestuje argument funkcji pod kątem'hi'
akceptacji zarówno ciągu, jak i ciągu, i powiedz mi, że jest to jasne.JSLint jest z natury bardziej defensywny, niż pozwala na to składnia JavaScript.
Z dokumentacji JSLint:
źródło
==
operatorem.===
Jest szczególnym przypadkiem ... JSLint próbuje się wydawać, używając==
jakoś się mylić ... Jednak, spróbuj tego:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
. Typy pierwotne mają odpowiednie klasy, które je zastępują (Number
,String
), a JavaScript zależy od==
operatora, aby porównać te naturalne.Pamiętaj, że JSLint narzuca jednej osobie wyobrażenie o tym, jaki powinien być dobry JavaScript. Nadal musisz kierować się zdrowym rozsądkiem przy wdrażaniu sugerowanych zmian.
Ogólnie rzecz biorąc, porównanie typu i wartości uczyni twój kod bezpieczniejszym (nie napotkasz nieoczekiwanego zachowania, gdy konwersja typów nie zrobi tego, co myślisz, że powinna).
źródło
Potrójne równe różni się od podwójnie równe, ponieważ oprócz sprawdzenia, czy dwie strony mają tę samą wartość, potrójnie równe sprawdza również, czy są one tego samego typu danych.
Tak
("4" == 4)
jest prawdą, podczas gdy("4" === 4)
jest fałszem.Potrójne równe również działa nieco szybciej, ponieważ JavaScript nie musi tracić czasu na wykonywanie jakichkolwiek konwersji typów przed udzieleniem odpowiedzi.
JSLint celowo ma na celu uczynienie kodu JavaScript tak ścisłym, jak to tylko możliwe, w celu zmniejszenia liczby niejasnych błędów. Podkreśla tego rodzaju rzeczy, próbując nakłonić cię do kodowania w sposób, który zmusza cię do poszanowania typów danych.
Ale dobrą rzeczą w JSLint jest to, że jest to tylko przewodnik. Jak mówią na stronie, to zrani twoje uczucia, nawet jeśli jesteś bardzo dobrym programistą JavaScript. Ale nie powinieneś czuć się zobowiązany do przestrzegania jego rad. Jeśli przeczytałeś, co ma do powiedzenia i rozumiesz to, ale masz pewność, że Twój kod się nie zepsuje, nie ma na tobie żadnego przymusu, aby cokolwiek zmienić.
Możesz nawet powiedzieć JSLint, aby ignorował kategorie kontroli, jeśli nie chcesz być bombardowany ostrzeżeniami, z którymi nie zamierzasz nic robić.
źródło
Cytat z http://javascript.crockford.com/code.html :
JSLint jest bardzo rygorystyczny, ich „webjslint.js” nie przechodzi nawet własnej weryfikacji.
źródło
webjslint.js
nie sprawdzanie poprawności - chociaż większość błędów, które teraz widzę, dotyczy odstępów. Oczywiście podczas przeglądania JavaScript przy użyciu JSLint należy kierować się zdrowym rozsądkiem i rozsądkiem.always
automatycznie dyskwalifikuje ten cytat jako mądrość. Sprytni programiści nie są dogmatyczni. Używają tego, co najlepsze w danej sytuacji. Z zadowoleniem przyjmują i przyjmują każde narzędzie wbudowane w sam rdzeń języka, a nie tylko odrzucają je za pomocą rozszerzeniajust never touch it
. Konkluzja: Mój kod jest krótszy (i to nie tylko dzięki zapisaniu jednego=
znaku), więc moja strona ładuje się szybciej, przy mniejszych kosztach przepustowości, dzięki czemu mój użytkownik jest lepiej obsługiwany.Jeśli chcesz przetestować pod kątem fałszywości. JSLint nie pozwala
if (foo == null)
ale pozwala
if (!foo)
źródło
===
, które zaleca JSLint.foo == null
sprawdza, czy nie ma wartości null lub undefined.!foo
sprawdza, czy nie ma null, undefined, 0 i pustego ciągu.Aby pomóc wyjaśnić to pytanie, a także wyjaśnić, dlaczego NetBeans (from) 7.3 zaczął wyświetlać to ostrzeżenie, jest to wyciąg z odpowiedzi w narzędziu do śledzenia błędów NetBeans, gdy ktoś zgłosił to jako błąd:
Dobrą praktyką jest używanie === zamiast == w JavaScript.
Odniesienie
źródło
Cóż, tak naprawdę nie może powodować problemów, po prostu daje rady. Zdecyduj sie. To powiedziawszy, nie jestem pewien, jakie to sprytne. Mogą istnieć konteksty, w których nie przedstawia tego jako problemu.
źródło