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