JavaScript Распространенные ошибки
В этой главе указаны некоторые распространенные ошибки JavaScript.
Случайное использование оператора присваивания
Программы JavaScript могут генерировать неожиданные результаты,
если программист случайно использует оператор присваивания (=)
вместо оператора сравнения (==) в операторе if.
Этот if оператор возвращает false (как и ожидалось),
потому что x не равно 10:
var x = 0;
if (x == 10)
Попробуйте сами »
Этот if оператор возвращается true (возможно,
не так, как ожидалось), потому что 10 верно:
var x = 0;
if (x = 10)
Попробуйте сами »
Этот if оператор возвращается false (возможно,
не так, как ожидалось), потому что 0 неверно:
var x = 0;
if (x = 0)
Попробуйте сами »
Присвоение всегда возвращает значение присваивания.
Ожидая бесполезного сравнения
При обычном сравнении тип данных не имеет значения. Это if заявление возвращает true:
var x = 10;
var y = "10";
if (x == y)
Попробуйте сами »
В строгом сравнении тип данных имеет значение. Этот if заявление возвращает false:
var x = 10;
var y = "10";
if (x === y)
Попробуйте сами »
Часто забывают, что в switch заявлении используется строгое сравнение:
Этот case switch отобразит предупреждение:
var x = 10;
switch(x) {
case 10: alert("Hello");
}
Попробуйте сами »
Этот case switch не будет отображать предупреждение:
var x = 10;
switch(x) {
case "10": alert("Hello");
}
Попробуйте сами »
Запутывающее сложение и конкатенация
Сложение касается сложения чисел.
Конкатенация это добавление строк.
В JavaScript обе операции используют один и тот же + оператор.
Из-за этого добавление числа в виде числа приведет к другому результату, чем добавление числа в виде строки:
var x = 10 + 5; //
результат в x равен 15
var x = 10 + "5";
// результат в x равен "105"
Попробуйте сами »
При добавлении двух переменных бывает трудно предвидеть результат:
var x = 10;
var y = 5;
var z = x + y;
// результат в z равен 15
var x = 10;
var y = "5";
var z =
x + y;
// результат в z равен "105"
Попробуйте сами »
Недоразумение поплавков
Все числа в JavaScript хранятся как 64-битные числа с плавающей запятой (Floats).
Все языки программирования, включая JavaScript, испытывают трудности с точными значениями с плавающей запятой:
var x = 0.1;
var y = 0.2;
var z = x + y
// результат в z не будет 0.3
Попробуйте сами »
Чтобы решить указанную выше проблему, помогает умножать и делить:
Разрыв строки JavaScript
JavaScript позволит вам разбить инструкцию на две строки:
Но разбить оператор в середине строки не получится:
Вы должны использовать "обратную косую черту", если вы должны разбить оператор в строке:
Неправильная точка с запятой
Из-за неправильной точки с запятой этот блок кода будет выполняться независимо от значения x:
if (x == 19);
{
// блок кода
}
Попробуйте сами »
Нарушение заявления о возврате
По умолчанию в JavaScript оператор автоматически закрывается в конце строки.
Из-за этого эти два примера вернут один и тот же результат:
JavaScript также позволит вам разбить инструкцию на две строки.
Из-за этого пример 3 также вернет тот же результат:
Но что произойдет, если вы разделите заявление return на две строки следующим образом:
Функция вернет undefined!
Почему? Потому что JavaScript думал, что вы имели в виду:
Объяснение
Если утверждение неполное, например:
var
JavaScript попытается завершить утверждение, прочитав следующую строку:
power = 10;
Но поскольку это утверждение является полным:
return
JavaScript автоматически закроет его так:
return;
Это происходит потому, что закрывающие (завершающие) заявления с точкой с запятой не являются обязательными в JavaScript.
JavaScript закроет заявление возврата в конце строки, потому что это полное заявление.
Никогда не нарушайте возвратное заявление.
Доступ к массивам с помощью именованных индексов
Многие языки программирования поддерживают массивы с именованными индексами.
Массивы с именованными индексами называются ассоциативными массивами (или хэшами).
JavaScript не поддерживает массивы с именованными индексами.
В JavaScript массивы используют нумерованные индексы:
Пример
var person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
var x = person.length;
// person.length вернет 3
var y = person[0];
// person[0] вернет "John"
Попробуйте сами »
В JavaScript объекты используют именованные индексы.
Если вы используете именованный индекс, при доступе к массиву JavaScript переопределит массив на стандартный объект.
После автоматического переопределения методы и свойства массива будут давать неопределенные или неверные результаты:
Пример:
var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length; // person.length вернет 0
var y = person[0];
// person[0] вернет undefined
Попробуйте сами »
Завершение определений запятой
Завершающие запятые в определениях объектов и массивов допустимы в ECMAScript 5.
Пример объекта:
person = {firstName:"John", lastName:"Doe", age:46,}
Пример массива:
points = [40, 100, 1, 5, 25, 10,];
ВНИМАНИЕ !!
Internet Explorer 8 выйдет из строя.
JSON не допускает конечных запятых.
JSON:
person = {"firstName":"John", "lastName":"Doe", "age":46}
JSON:
points = [40, 100, 1, 5, 25, 10];
Неопределенное не равно Null
Объекты, переменные, свойства и методы JavaScript могут быть undefined.
Кроме того, пустые объекты JavaScript могут иметь значение null.
Это может немного затруднить проверку того, пуст ли объект.
Вы можете проверить, существует ли объект, проверив его тип undefined:
Но вы не можете проверить, есть ли объект null,
потому что это вызовет ошибку, если объект undefined:
Неправильно:
if (myObj === null)
Чтобы решить эту проблему, вы должны проверить, нет ли объекта null, и нет undefined.
Но это все равно может вызвать ошибку:
Неправильно:
if (myObj !== null && typeof myObj
!== "undefined")
Из-за этого вы должны протестировать на нет, undefined
прежде чем сможете проверить на нет null:
