Какая разница между
TypeError: ... is undefined
и
ReferenceError: ... is not defined
?
Какая разница между
TypeError: ... is undefined
и
ReferenceError: ... is not defined
?
ReferenceError
возникает, когда вы пытаетесь использовать переменную, которой вообще не существует.
TypeError
возникает, когда переменная существует, но операция, которую вы пытаетесь выполнить, не подходит для типа содержащегося в ней значения. В случае, когда подробное сообщение говорит «не определено», это может произойти, если у вас есть переменная, значение которой является специальным значением undefined
, и вы пытаетесь получить доступ к ее свойству.
См. http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/ для некоторого обсуждения, связанного с этим.
Спецификация JavaScript 1.5 определяет шесть основных типов ошибок:
EvalError: Возникает при неправильном использовании функций eval().
RangeError: Возникает, когда числовая переменная выходит за допустимый диапазон.
ReferenceError: Возникает при использовании недопустимой ссылки.
SyntaxError: Возникает при возникновении синтаксической ошибки при анализе кода JavaScript.
TypeError: Возникает, когда тип переменной не соответствует ожидаемому.
строгий текст URIError: возникает, когда функции encodeURI()
или decodeURI()
используются неправильным образом.
Рассмотрим следующий код:
function foo(){
var d=1234;
console.log(d.substring(1,2));
}
foo();
Это будет иметь следующий вывод:
Исключение: TypeError: d.substring не является функцией. Это связано с тем, что мы использовали неправильный тип (число) для данной операции (подстрока, которая ожидает строку). Объект TypeError представляет ошибку, когда значение не соответствует ожидаемому типу. .
function foo(){
var d=1234;
console.log(c);
}
foo();
Это будет иметь следующий вывод:
Исключение: ReferenceError: c не определено. Это связано с тем, что ссылка для переменной «c» не существует ни в локальной, ни в глобальной области видимости, и мы все еще пытаемся ее использовать. Исключение ReferenceError возникает при доступе к несуществующей переменной. .
Эталонная ошибка — это ошибка сбоя разрешения осциллографа. В TypeError разрешение области успешно, но мы пытаемся выполнить недопустимое действие над переменной, которая не разрешена.
Следующий пример даст четкое представление об этих двух типах ошибок.
function foo(a){
console.log(a+b);//ReferenceError b is not defined
b=a;
}
foo(2);
Выполнение вышеуказанной функции приводит к ошибке TypeError, поскольку b не определен в момент, когда компилятор достигает инструкции console.log(a+b). Обратите внимание на >b не объявлен с ключевым словом var.
Теперь рассмотрим функцию ниже,
function foo(a){
console.log(a+b);
var b=a;
}
foo(2);//NaN
Когда вышеприведенная функция выполняется, компилятор поднимает переменную b в области видимости функции, после компиляции функция выглядит примерно так
function foo(a){
var b;//--> b has a value of undefined at this point
console.log(a+b);
b=a;
}
foo(2);//NaN
когда движок выполняет console.log(a+b), в этот момент a имеет значение 2, а b имеет значение undefined, следовательно, его журналы NaN. Поскольку выражение ниже оценивается как NaN
2 + undefined;// evaluates to NaN
Теперь перейдем к TypeError. Рассмотрим следующий блок кода, как обычно, мы возьмем функцию foo.
function foo(a){
console.log(a+b.toString()); //TypeError Cannot read property 'toString' of undefined
var b = a;
}
foo(2);
Следуя приведенной выше логике, компилятор превращает функцию во что-то вроде приведенного ниже кода после того, как переменная b будет поднята.
function foo(a){
var b ;// b has a value of undefined at this point
console.log(a+b.toString()); //TypeError is thrown
b= a;
}
foo(2);
В рамках функции переменная b поднимается и, следовательно, имеет значение undefined перед строкой console.log(a+b.toString()). В этой строке мы пытаемся преобразовать b, который на данный момент не определен, в строку, при этом мы пытаемся выполнить недопустимую операцию, поэтому выдается ошибка TypeError. Поиск области действия для переменной b прошел успешно, но мы выполнили недопустимую операцию. Следовательно, была выброшена ошибка TypeError.
Глядя на приведенное выше объяснение ошибки ссылки, что может вызывать ошибку ссылки на этот код const arr = [1,2,3,4,5,6,7,8,9,10] let B = [[(arr[1 ] = обр[8])],[(обр[8] = обр[1])]]