САЙТ ДЛЯ ВЕБ РАЗРАБОТЧИКОВ НА РУССКОМ ЯЗЫКЕ
×

JS Учебник

JS Главная JS Введение JS Установка JS Вывод JS Синтаксис JS Заявления JS Комментарии JS Переменные JS Операторы JS Арифметика JS Присваивания JS Типы данных JS Функции JS Объекты JS Область JS События JS Строки JS Методы строк JS Числа JS Методы чисел JS Массивы JS Методы массива JS Сортировка массива JS Итерация массива JS Даты JS Формат даты JS Метод получения дат JS Методы набора... JS Математические... JS Случайные числа JS Булевы JS Сравнение... JS Заявления if...else JS Заявление switch JS Цикл for JS Цикл while JS Заявление break... JS Преобразование... JS Битовые... JS Регулярные выражения JS Ошибки JS Отладчик JS Подъемный JS Строгий JS Ключевое слово this JS Руководство стиля JS Практика JS Распространенные ошибки JS Эффективность JS Зарезервированные слова JS Версии JS Версия ES5 JS Версия ES6 JS JSON

JS Формы

JS Формы JS Формы API

JS Объекты

Определение объекта Свойства объекта Методы объекта Доступ к объекту Конструкторы объекта Прототипы объекта Объект ECMAScript 5

JS Функции

Определение функции Параметры функции Вызов Функции Вызвать Функцию Применение функции Закрытие Функции

JS HTML DOM

DOM Введение DOM Методы DOM Документы DOM Элементы DOM HTML DOM CSS DOM Анимация DOM События DOM Слушатель события DOM Навигация DOM Узлы DOM Коллекции DOM Список узлов

JS Браузера BOM

JS Окно JS Экран JS Местоположение JS История JS Навигатор JS Всплывающее окна JS Синхронизация JS Cookies

JS AJAX

AJAX Введение AJAX XMLHttp AJAX Запрос AJAX Ответ AJAX XML Файл AJAX PHP AJAX ASP AJAX База данных AJAX Приложения AJAX Примеры

JS JSON

JSON Введение


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
Попробуйте сами »

Чтобы решить проблему выше, он помогает умножать и делить:

Пример

var z = (x * 10 + y * 10) / 10;       // z будет 0.3
Попробуйте сами »

Разрыв строки JavaScript

JavaScript позволит разбить высказывание на две строки:

Пример 1

var x =
"Привет мир!";
Попробуйте сами »

Но, разрывая заявление в середине строки не будет работать:

Пример 2

var x = "Привет
мир!";
Попробуйте сами »

Вы должны использовать "обратная косая черта" если необходимо разбить заявление в строке:

Пример 3

var x = "Привет \
мир!";
Попробуйте сами »

Неуместная точка с запятой

Из-за неуместной точки с запятой этот блок кода будет выполняться независимо от значения x:

if (x == 19);
{
    // блок кода
}
Попробуйте сами »

Разрыв заявления return

По умолчанию JavaScript автоматически закрывает заявление в конце строки.

Из-за этого эти два примера вернут один и тот же результат:

Пример 1

function myFunction(a) {
    var power = 10 
    return a * power
}
Попробуйте сами »

Пример 2

function myFunction(a) {
    var power = 10;
    return a * power;
}
Попробуйте сами »

JavaScript также позволит вам разбить заявление на две строки.

Из-за этого Пример 3 также вернет тот же результат:

Пример 3

function myFunction(a) {
    var
    power = 10; 
    return a * power;
}
Попробуйте сами »

Но, что произойдет, если вы сломаете заявление return в двух строках, как это:

Пример 4

function myFunction(a) {
    var
    power = 10; 
    return
    a * power;
}
Попробуйте сами »

Функция вернет undefined!

Почему? Потому что JavaScript думает, что вы имели в виду:

Пример 5

function myFunction(a) {
    var
    power = 10; 
    return;
    a * power;
}
Попробуйте сами »

Объяснение

Если утверждение является неполным, как:

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:

Пример:

if (typeof myObj === "undefined") 
Попробуйте сами »

Но вы не можете проверить, является ли объект null, потому что это вызовет ошибку, если объект не определен:

Неправильно:

if (myObj === null) 

Чтобы решить эту проблему, необходимо проверить, не является ли объект null, и не undefined.

Но это все равно может привести к ошибке:

Неправильно:

if (myObj !== null && typeof myObj !== "undefined") 

Из-за этого, вы должны проверить для не undefined прежде чем вы можете проверить для не null:

Правильно:

if (typeof myObj !== "undefined" && myObj !== null) 
Попробуйте сами »