JavaScript Поширені помилки
В цьому розділі вказані деякі поширені помилки JavaScript.
Випадкове використання оператора присвоювання
Програми JavaScript можуть генерувати неочікувані результати, якщо програміст випадково використає оператор присвоювання (=) замість оператора порівняння (==) в операторі if.
Цей оператор if повертає false (як і очікувалось), оскільки x не дорівнює 10:
let x = 0;
if (x == 10)
Спробуйте самі »
Цей оператор if повертає true (можливо, не так, як очікувалось), тому що 10 є true:
let x = 0;
if (x = 10)
Спробуйте самі »
Цей оператор if повертає false (можливо, не так, як очікувалось), тому що 0 - це false:
let x = 0;
if (x = 0)
Спробуйте самі »
Присвоєння завжди повертає значення присвоювання.
Очікування нечіткого порівняння
При звичному порівнянні тип даних не має значения. Цей оператор if повертає значення true:
let x = 10;
let y = "10";
if (x == y)
Спробуйте самі »
В строгому порівнянні тип даних має значення. Цей оператор if повертає false:
let x = 10;
let y = "10";
if (x === y)
Спробуйте самі »
Часто забувають, що в операторах switch використовується строге порівняння:
Цей case switch буде відображати попередження:
let x = 10;
switch(x) {
case 10: alert("Hello");
}
Спробуйте самі »
Цей case switch не буде відображати попередження:
let x = 10;
switch(x) {
case "10": alert("Hello");
}
Спробуйте самі »
Незрозуміле додавання & Конкатенація
Додавання - це додавання чисел.
Конкатенація - это додавання рядків.
В JavaScript в обох операціях використовується один і той самий оператор +.
Із-за цього додавання числа як числа призведе до іншого результату, ніж додавання числа у вигляді рядка:
let x = 10;
x = 10 + 5; // Тепер x дорівнює 15
let y = 10;
y += "5"; // Тепер y дорівнює "105"
Спробуйте самі »
При додаванні двох змінних буває важко передбачити результат:
let x = 10;
let y = 5;
let z = x + y; // Тепер z дорівнює 15
let x = 10;
let y = "5";
let z = x + y; // Тепер z дорівнює "105"
Спробуйте самі »
Нерозуміння чисел з плаваючою комою (флоатів)
Всі числа в JavaScript зберігаються як 64-бітні числа з плаваючою комою (флоати).
Всі мови програмування, включаючи JavaScript, мають складнощі з точними значеннями з плаваючою комою:
let x = 0.1;
let y = 0.2;
let z = x + y // результат z не буде 0.3
Спробуйте самі »
Щоб вирішити вказану вище проблему, допомагає множення та ділення:
Розрив рядка JavaScript
JavaScript дозволяє розбити оператор на два рядка:
Але розбити вираз в середині рядка не вийде:
Необхідно використовувати "бекслеш" (зворотну косу риску \ ), якщо треба розбити оператор на рядок:
Неправильне встановлення крапки з комою
Із-за неправильної крапки з комою цей блок коду буде виконуватись незалежно від значення x:
if (x == 19);
{
// блок коду
}
Спробуйте самі »
Порушення інструкції про повернення
За замовчуванням в JavaScript оператор автоматично закривається в кінці рядка.
По цій причині ці два приклади повертають однаковий результат:
JavaScript також дозволяє розбити оператор на два рядка.
Із-за цього приклад 3 також поверне той самий результат:
Але що відбудеться, якщо розділити оператор return на два рядки, як тут:
Функція поверне undefined!
Чому? Тому що JavaScript подумав, що ви мали на увазі наступне:
Пояснення
Якщо інструкція неповна, наприклад:
let
JavaScript намагається завершити інструкцію, прочитавши наступний рядок:
power = 10;
Але оскільки ця інструкція є повною:
return
JavaScript автоматично закриє її ось так:
return;
Це відбувається тому, що закриваючі (завершуючі) оператори з крапкою з комою не є обов’язковими в JavaScript.
JavaScript закриє оператор повернення (return) в кінці рядка, тому що це повна інструкція.
Николи не забувайте про оператор return.
Доступ до масивів за допомогою іменованих індексів
Багато мов програмування підтримують масиви з іменованими індексами.
Масиви з іменованими індексами називаються асоціативними масивами (або хешами).
JavaScript не підтримує масиви з іменованими індексами.
В JavaScript масиви використовують нумеровані індекси:
Приклад
const person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
person.length; // person.length поверне 3
person[0]; // person[0] поверне "John"
Спробуйте самі »
В JavaScript об’єкти використовують іменовані індекси.
Якщо ви використовуєте іменований індекс при доступі до масиву, JavaScript перевизначить масив на стандартний об’єкт.
Після автоматичесного перевизначення методи і властивості масиву будуть давати невизначені (undefined) або невірні (incorrect) результати:
Приклад:
const person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
person.length; // person.length поверне 0
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];
Undefined не дорівнює нулю
Об’єкти, змінні, властивості та методи JavaScript можуть бути undefined.
Крім того, пусті об’єкти JavaScript можуть мати значення null.
Це може дещо ускладнити перевірку того, що об’єкт пустий.
Ви можете перевірити, чи існує об’єкт, перевіривши його тип undefined:
Але ви не можете перевірити, чи є об’єкт null, тому що це викличе помилку, якщо об’єкт undefined:
Невірно:
if (myObj === null)
Щоб вирішити цю проблему, ви маєте перевірити, чи не є об’єкт null, та не є undefined.
Але це все одно може викликати помилку:
Невірно:
if (myObj !== null && typeof myObj !== "undefined")
Із-за цього ви маєте перевірити, не undefined до того, як ви зможете перевірити не null:

