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