
Помилки в JavaScript досить складно відстежувати і виправляти. У кожної помилки є своя назва. Це допомагає з визначенням проблеми та її виправленням. Необроблені помилки відображаються у веб-консолі браузера або виводі Node.js додатка. Розглянемо типи поширених помилок у JavaScript, причини виникнення та як їх виправити. За кожним типом показано приклади, щоб покращити ваше розуміння помилки та дій для виправлення.
Немає єдиного стандарту іменувань помилок у різних браузерах. Для статті взято імена помилок із браузера Google Chrome.
TypeError: Cannot read property “x” of “y”

Ця помилка виникає, коли ми викликаємо метод або читаємо властивість на значеннях undefined або null.
У браузері Safari ці помилки названі по-іншому:
- ‘undefined’ is not an object
- ‘null’ is not an object
У браузері Mozilla Firefox:
- TypeError: "x" is undefined
- TypeError: "x" is null
Приклади помилок
- Виклик функції на undefined:
let foo;
foo.read(); // TypeError: Cannot read property 'read' of undefined- Читання властивості на null:
foo = null;
foo.total; // TypeError: Cannot read property 'total of nullВиправлення помилки
Є кілька варіантів виправлення залежно від контексту проблеми.
- Задати значення змінній або властивості об'єкта перед його використанням.
let foo = {
  total: 5
};
let total = foo.total; // 5- Перевіряти, що змінна визначена, перед її використанням.
if (typeof foo !== 'undefined' && typeof foo.total !== 'undefined') {
  let total = foo.total;
}TypeError: “x” is not a function

Помилка відбувається, коли ми намагаємося викликати невизначену функцію.
Приклади помилок
Є кілька варіантів виправлення залежно від причин помилки:
- Функція не визначена.
let x = {};
x.read(); // TypeError: x.read is not a functionУ цьому прикладі визначимо функцію read().
let x = {
    read: function() {
        return 2;
    }
};
x.read(); // 2- У місці виклику або оголошенні функції є помилка в імені функції.
let a = {
  sam: function(a, b) {
    return a + b;
  }
}
a.sum(1, 1); // TypeError: a.sum is not a functionПісля виправлення помилки в імені функції sum().
let a = {
  sum: function(a, b) {
    return a + b;
  }
}
a.sum(1, 1); // 2TypeError: Cannot set property “x” of undefined

Ця помилка виникає, коли ми намагаємося записати у властивість undefined значення.
let test;
test.value = 0; // Uncaught TypeError: Cannot set property 'value' of undefinedРішенням у цьому прикладі буде ініціалізація змінної test новим об'єктом так:
let test = {};
test.value = 0;Або ось так:
let test = {
  value: 0
};ReferenceError: “x” is not defined

Ця помилка виникає в кількох випадках.
Змінна не оголошена
text.trim(); // Uncaught ReferenceError: text is not definedЗмінна text не оголошена. Для використання строкового методу trim() змінну text потрібно оголосити та ініціалізувати строкою.
let text = " Test ";
text.trim(); // "Test"Немає доступу до змінної в поточній області видимості
function test() {
  let a = 0;
}
console.log(a); // Uncaught ReferenceError: a is not definedЗмінну a потрібно зробити доступною для використання там, де відбувається помилка.
let a = 0;
function test() {
  a = 1;
}
console.log(a); // 0
test();
console.log(a); // 1RangeError: Maximum call stack size exceeded
Ця помилка виникає в разі виклику нескінченної рекурсивної функції. Така функція не має виходу з неї або він не застосовується.
function countDown(fromNumber) {
    console.log(fromNumber);
    countDown(fromNumber - 1); // RangeError: Maximum call stack size exceeded
}
countDown(10);Щоб виправити цю помилку в рекурсивну функцію countDown() нам потрібно додати умову для виходу з рекурсії.
function countDown(fromNumber) {
    console.log(fromNumber);
    let nextNumber = fromNumber - 1;
    if (nextNumber > 0) {
        countDown(nextNumber);
    }
}
countDown(10);RangeError: precision is out of range

Помилка відбувається коли число, що виходить за межі допустимого діапазону, було передано до функцій toExponential(), toFixed(), або toPrecision().
let num = 4.777777;
num.toExponential(-2); // RangeError: toExponential() argument must be between 0 and 100
num = 4.8888;
num.toFixed(105);  // RangeError: toFixed() digits argument must be between 0 and 100
num = 4.1234;
num.toPrecision(0);  // RangeError: toPrecision() argument must be between 1 and 100Щоб виправити, будемо використовувати допустимі значення.
let num = 4.777777;
num.toExponential(4); // 2.5556e+0
num = 4.8888;
num.toFixed(2); // 3.00
num = 4.1234;
num.toPrecision(1); // 4RangeError: invalid array length

Ця помилка виникає, якщо ми задаємо масиву неприпустимий розмір: від'ємний або більший за 232.
new Array(-10); // RangeError: Invalid array length
let a = [];
a.length = a.length - 5; // RangeError: Invalid array lengthДля вирішення цієї помилки нам потрібно використовувати допустиму довжину масиву.
new Array(10); // [empty × 10]Корисні посилання

Резюме
Сподіваюся, ви дізналися щось нове для себе. І зможете визначати причину помилок у JavaScript та спосіб їх виправлення. Ці помилки можуть виникати в робочих проєктах і краще заздалегідь мати уявлення про них.
Дякую, що прочитали. Буду вам дуже вдячний, якщо поділитесь цією статтею!
Опубліковано