Ten rozdział wskazuje na kilka typowych błędów JavaScript.
Przypadkowo Korzystanie operatora przypisania
Programy JavaScript może generować nieoczekiwane rezultaty, jeśli programista przypadkowo używa operator przypisania (=) , a nie operator porównania (==) w razie stwierdzenia.
To if wyrażenie zwraca false (zgodnie z oczekiwaniami), ponieważ x nie jest równe 10:
var x = 0;
if (x == 10)
Spróbuj sam " To if wyrażenie zwraca true (może nie tak oczekiwany), ponieważ 10 jest prawdziwe:
var x = 0;
if (x = 10)
Spróbuj sam " To if wyrażenie zwraca false (może nie tak oczekiwany), ponieważ 0 jest fałszywe:
var x = 0;
if (x = 0)
Spróbuj sam " Przypisanie zawsze zwraca wartość zlecenia.
Spodziewając Porównanie Loose
W regularnych porównania, typ danych nie ma znaczenia. Ta if zwróci true :
var x = 10;
var y = "10";
if (x == y)
Spróbuj sam " W bezpośrednim porównaniu, typ danych ma znaczenia. Ta if zwraca false :
var x = 10;
var y = "10";
if (x === y)
Spróbuj sam " Jest to częsty błąd zapomnieć, że oświadczenia przełącznika używać ścisłego porównania:
Przełącznik ten przypadek wyświetli alert:
var x = 10;
switch(x) {
case 10: alert("Hello");
}
Spróbuj sam " Przełącznik ten przypadek nie wyświetli alert:
var x = 10;
switch(x) {
case "10": alert("Hello");
}
Spróbuj sam " Dodawanie i mylące Łączenie
Dodatek jest o dodawaniu liczb.
Łączenie jest o dodawaniu sznurki.
W JavaScript obie operacje używać tego samego operatora +.
W związku z tym, dodanie numer jako numerze jest inny wynik dodawania numeru jako wyrażenie:
var x = 10 + 5; //
the result in x is 15
var x = 10 + "5";
// the result in x is "105"
Spróbuj sam " Podczas dodawania dwóch zmiennych, może być trudne do przewidzenia wynik:
var x = 10;
var y = 5;
var z = x + y;
// the result in z is 15
var x = 10;
var y = "5";
var z =
x + y;
// the result in z is "105"
Spróbuj sam " nieporozumienie pływaków
Wszystkie numery w JavaScript są zapisywane jako 64-bitowych liczb zmiennoprzecinkowych (float).
Wszystkie języki programowania, w tym JavaScript, mają trudności z precyzyjnym wartości zmiennoprzecinkowych:
var x = 0.1;
var y = 0.2;
var z = x + y
// the result in z will not be 0.3
if (z == 0.3)
// this if test will fail
Spróbuj sam " Aby rozwiązać powyższy problem, pomaga mnożenie i dzielenie:
Złamanie JavaScript String
JavaScript pozwala przełamać oświadczenie na dwie linie:
Ale, łamiąc oświadczenie w środku łańcucha nie będzie działać:
Musisz użyć "ukośnik" jeśli trzeba złamać oświadczenie w ciągu:
misplacing średnik
Ze względu na zagubienia średnikiem, blok ten kod wykonać niezależnie od wartości x:
if (x == 19);
{
// code block
}
Spróbuj sam " Złamanie instrukcji return
Jest to zachowanie domyślne JavaScript zamknąć komunikatu automatycznie na końcu linii.
W związku z tym, te dwa przykłady zwrócić ten sam wynik:
JavaScript będzie również pozwalają przełamać oświadczenie na dwie linie.
W związku z tym, przykład 3 również zwrócić ten sam wynik:
Ale co się stanie, jeśli złamiesz instrukcji return w dwóch wierszach, takich jak ten:
Funkcja zwróci niezdefiniowana!
Czemu? Ponieważ JavaScript myśli, że rozumie:
Wyjaśnienie
Jeżeli oświadczenie jest niekompletne, takich jak:
var
JavaScript będzie starał się wypełnić oświadczenie czytając następną linię:
power = 10;
Ale ponieważ to stwierdzenie jest kompletna:
return
JavaScript automatycznie zamknie go w następujący sposób:
return;
Dzieje się tak dlatego zamknięcia (zakończenia) sprawozdanie ze średnikiem jest opcjonalny w JavaScript.
JavaScript zamyka return na końcu linii, gdyż jest pełna stwierdzenie.
Nigdy nie złamać instrukcji return.
Dostęp do tablic z nazwanych indeksów
Wiele języków programowania obsługują macierze z wymienionych indeksów.
Tablice z wymienionych indeksów nazywane są tablice asocjacyjne (lub skrótów).
JavaScript nie obsługuje macierze z wymienionych indeksów.
W JavaScript, tablice używać indeksów ponumerowanych:
Przykład
var person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
var x = person.length;
// person.length will return 3
var y = person[0];
// person[0] will return "John"
Spróbuj sam " W JavaScript, obiekty używać nazwanych indeksów.
Jeśli używasz nazwie indeksu, przy dostępie do tablicy, JavaScript będzie przedefiniować tablicę do standardowego obiektu.
Po automatycznym redefinicji, metody i właściwości tablicy będzie produkować niezdefiniowanych lub nieprawidłowych wyników:
Przykład:
var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length; // person.length will
return 0
var y = person[0];
// person[0] will return undefined
Spróbuj sam " Kończąc definicji tablicy przecinkami
Błędny:
points = [40, 100, 1, 5, 25, 10,];
Niektóre silniki JSON i JavaScript nie powiedzie, lub zachowywać się niespodziewanie.
Poprawny:
points = [40, 100, 1, 5, 25, 10];
Zakończenie definicji obiektu przecinkami
Błędny:
person = {firstName:"John", lastName:"Doe", age:46,}
Niektóre silniki JSON i JavaScript nie powiedzie, lub zachowywać się niespodziewanie.
Poprawny:
person = {firstName:"John", lastName:"Doe", age:46}
Niezdefiniowany is Not Null
Z JavaScript, null jest dla obiektów, jest niezdefiniowana dla zmiennych, właściwości i metod.
Aby być null, obiekt musi być zdefiniowana, w przeciwnym razie zostanie ona zdefiniowana.
Jeśli chcesz sprawdzić, czy obiekt istnieje, to wygeneruje błąd, jeśli obiekt jest nieokreślony:
Błędny:
if (myObj !== null && typeof myObj !== "undefined")
Z tego powodu należy sprawdzić typeof () po raz pierwszy:
Poprawny:
if (typeof myObj !== "undefined" && myObj !== null)
Spodziewając Blok Poziom Zakres
JavaScript nie stworzyć nowe możliwości dla każdego bloku kodu.
To prawda, w wielu językach programowania, ale nie jest prawdą w JavaScript.
Jest to częsty błąd, wśród nowych programistów JavaScript, aby wierzyć, że kod ten zwraca niezdefiniowana: