Częste błędy w JavaScript
- Poprzednia strona Najlepsze praktyki JS
- Następna strona Wydajność JS
Rozdział ten omawia kilka powszechnych błędów JavaScript.
niespodziewane użycie operatora przypisania
Jeśli programista używa if
Niespodziewane użycie operatora przypisania w=
)zamiast operatora porównania (====
), program JavaScript może generować niektóre nieprzewidywalne wyniki.
To if
Zdanie zwraca false
(jak można się spodziewać), ponieważ x nie jest równe 10:
var x = 0; if (x == 10)
To if
Zdanie zwraca true
(może nie tak, jak można się spodziewać), ponieważ 10 jest prawdą:
var x = 0; if (x = 10)
To if
Zdanie zwraca false
(może nie tak, jak można się spodziewać), ponieważ 0 jest fałszem:
var x = 0; if (x = 0)
Przypisanie zawsze zwraca wartość przypisania.
Oczekiwane rozluźnione porównanie
W tradycyjnym porównaniu typ danych nie jest ważny. To if
Zdanie zwraca true
:
var x = 10; var y = "10"; if (x == y)
W rygorystycznym porównaniu typ danych jest rzeczywiście ważny. To if
Zdanie zwraca false
:
var x = 10; var y = "10"; if (x === y)
Jednym z powszechnych błędów jest zapomnienie o switch
Zdanie używa rygorystycznego porównania:
To switch
Zdanie wyświetli okno dialogowe:
var x = 10; switch(x) { case 10: alert("Hello"); }
To switch
Zdanie nie wyświetli okna dialogowego:
var x = 10; switch(x) { case "10": alert("Hello"); }
Zdezorientujące dodawanie i kaskadowość
Dodaćdo dodawaniaLiczby。
Kaskadowe (Concatenation)do dodawaniaCiąg znaków。
W JavaScript oba operatory są używane w ten sam sposób +
Operator.
Dlatego dodawanie liczb jako liczb do dodawania liczb jako ciągów znaków generuje różne wyniki:
var x = 10 + 5; // wynik w x wynosi 15 var x = 10 + "5"; // wynik w x wynosi "105"
Jeśli dodajemy dwie zmienne, trudno przewidzieć wynik:
var x = 10; var y = 5; var z = x + y; // wynik w z wynosi 15 var x = 10; var y = "5"; var z = x + y; // wynik w z wynosi "105"
Zrozumiałe liczby zmiennoprzestrzenne
W JavaScript liczby są zawsze przechowywane jako 64-bitoweLiczby zmiennoprzestrzenne (Floats)。
Wszystkie języki programowania, w tym JavaScript, mają trudności z obsługą wartości zmiennoprzestrzennych:
var x = 0.1; var y = 0.2; var z = x + y // wynik w z nie będzie 0.3
Aby rozwiązać powyższy problem, użyj operacji mnożenia i dzielenia:
Przykład
var z = (x * 10 + y * 10) / 10; // wynik w z będzie 0.3
Zmiana wiersza w ciągu znaków JavaScript
JavaScript pozwala na dzielenie jednego polecenia na dwa wiersze:
Przykład 1
var x = "Hello World!";
Ale wprowadzenie wiersza w ciągu ciągu znaków jest niewłaściwe:
Przykład 2
var x = "Hello World!";
Przykład 3
var x = "Hello \", World!";
Złe umiejscowienie średnika
Z powodu błędnego średnika, ten blok kodu będzie wykonywany niezależnie od wartości x:
if (x == 19); { // blok kodu }
Zmiana wiersza polecenia return
Automatyczne zamknięcie wiersza na końcu to domyślne zachowanie JavaScript.
Dlatego te dwa przykłady zwracają ten sam wynik:
Przykład 1
function myFunction(a) { var power = 10 return a * power }
Przykład 2
function myFunction(a) { var power = 10; return a * power; }
JavaScript pozwala również na dzielenie jednego polecenia na dwa wiersze.
Dlatego przykład 3 również zwróci ten sam wynik:
Przykład 3
function myFunction(a) { var power = 10; return a * power; }
Ale jeśli return
Co się stanie, jeśli wiersz polecenia zostanie podzielony na dwa wiersze?
Przykład 4
function myFunction(a) { var power = 10; return a * power; }
Ta funkcja zwróci undefined
!
Dlaczego? Ponieważ JavaScript uważa, że masz na myśli:
Przykład 5
function myFunction(a) { var power = 10; return; a * power; }
Wyjaśnienie
Jeśli polecenie jest niekompletne:
var
JavaScript dokończy to polecenie czytając następny wiersz:
power = 10;
Ale ponieważ to polecenie jest pełne:
return
JavaScript automatycznie zamknie to polecenie:
return;
Dzieje się tak, ponieważ w JavaScript, zamknięcie polecenia (koniec) za pomocą średnika jest opcjonalne.
JavaScript zamknie wiersz na końcu return
została, ponieważ jest to pełne polecenie.
Nigdy nie używaj return
Zmiana wiersza na nowy.
Dostęp do tablicy poprzez indeksowanie nazwanym
Wiele języków programowania obsługuje tablice z nazwanymi indeksami.
Tablice z nazwanymi indeksami są nazywane tablicami związonymi (lub haszami).
JavaScript NieobsługiwaneTablica z nazwanymi indeksami.
W JavaScript,TablicaUżywajNumerowe indeksy:
Przykład
var person = []; person[0] = "Bill"; person[1] = "Gates"; person[2] = 46; var x = person.length; // person.length zwróci 3 var y = person[0]; // person[0] zwróci "Bill"
W JavaScript,ObiektUżywajNazwane indeksy。
Jeśli używasz nazwanych indeksów, JavaScript będzie przedefiniowywał tablicę jako standardowy obiekt przy dostępie do tablicy.
Po automatycznym przedefiniowaniu, metody lub atrybuty tablicy mogą generować wyniki niezdefiniowane lub niepoprawne:
Przykład
var person = []; person["firstName"] = "Bill"; person["lastName"] = "Gates"; person["age"] = 46; var x = person.length; // person.length zwróci 0 var y = person[0]; // person[0] zwróci undefined
Używaj przecinków, aby zakończyć definicję
Przecinki końcowe w definicji obiektu i tablicy są dozwolone w ECMAScript 5.
Przykład obiektu:
person = {firstName:"Bill", lastName:"Gates", age:62,}
Przykład tablicy:
points = [35, 450, 2, 7, 30, 16,];
Ostrzeżenie!!!
Internet Explorer 8 może się zawiesić.
JSON nie pozwala na użycie przecinków końcowych.
JSON:
person = {firstName:"Bill", lastName:"Gates", age:62}
JSON:
points = [35, 450, 2, 7, 30, 16];
Undefined nie jest Null
Obiekt JavaScript, zmienna, atrybut i metoda mogą być niezdefiniowane.
W szczególności, wartość pustego obiektu JavaScript może być: null
。
To może uczynić zbadanie, czy obiekt jest pusty, nieco trudnym zadaniem.
Możesz sprawdzić, czy typ jest: undefined
Testować, czy obiekt istnieje:
Przykład
if (typeof myObj === "undefined")
ale nie możesz sprawdzić, czy obiekt jest null
ponieważ, jeśli obiekt jest undefined, wywoła błąd:
Niepoprawne:
if (myObj === null)
Aby rozwiązać ten problem, musisz sprawdzić, czy obiekt jest null
zamiast undefined.
ale nadal wywoła błąd:
Niepoprawne:
if (myObj !== null && typeof myObj !== "undefined")
Dlatego, zanim przetestujesz, że nie jest null, musisz najpierw sprawdzić, czy nie jest undefined:
Poprawne:
if (typeof myObj !== "undefined" && myObj !== null)
oczekuje zasięgu blokowego
JavaScript nietworzy nowy zasięg dla każdego bloku kodu.
Wiele języków programowania działa w ten sposób, ale JavaScript Nie jest to prawda。
myśli, że ten kod zwróci undefined
to częsty błąd nowego dewelopera JavaScript:
Przykład
for (var i = 0; i < 10; i++) { // Blok kodu } return i;
- Poprzednia strona Najlepsze praktyki JS
- Następna strona Wydajność JS