
Ошибки в 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 и способ их исправления. Эти ошибки могут возникать в рабочих проектах и лучше заранее иметь представление о них.
Спасибо, что прочитали. Буду вам очень признателен если поделитесь этой статьей!
Опубликовано