Разница TypeError и ReferenceError

Какая разница между

TypeError: ... is undefined

и

ReferenceError: ... is not defined

?


person Evgenij Reznik    schedule 25.09.2012    source источник
comment
Стандарт ECMAScript определяет, в каких сценариях возникает каждый тип ошибки. Полный список этих сценариев см. здесь.   -  person Šime Vidas    schedule 25.09.2012
comment
Не могли бы вы привести примеры кода, которые вызывают эти ошибки?   -  person Šime Vidas    schedule 25.09.2012


Ответы (5)


ReferenceError возникает, когда вы пытаетесь использовать переменную, которой вообще не существует.

TypeError возникает, когда переменная существует, но операция, которую вы пытаетесь выполнить, не подходит для типа содержащегося в ней значения. В случае, когда подробное сообщение говорит «не определено», это может произойти, если у вас есть переменная, значение которой является специальным значением undefined, и вы пытаетесь получить доступ к ее свойству.

См. http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/ для некоторого обсуждения, связанного с этим.

person Barmar    schedule 25.09.2012

Вот типы ошибок JavaScript:

Спецификация JavaScript 1.5 определяет шесть основных типов ошибок:

EvalError: Возникает при неправильном использовании функций eval().

RangeError: Возникает, когда числовая переменная выходит за допустимый диапазон.

ReferenceError: Возникает при использовании недопустимой ссылки.

SyntaxError: Возникает при возникновении синтаксической ошибки при анализе кода JavaScript.

TypeError: Возникает, когда тип переменной не соответствует ожидаемому.

строгий текст URIError: возникает, когда функции encodeURI() или decodeURI() используются неправильным образом.

person Community    schedule 05.06.2014

Рассмотрим следующий код:

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 возникает при доступе к несуществующей переменной. .

person Prashant_M    schedule 11.07.2015

Эталонная ошибка — это ошибка сбоя разрешения осциллографа. В 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.

person xenon-92    schedule 15.04.2020

Глядя на приведенное выше объяснение ошибки ссылки, что может вызывать ошибку ссылки на этот код const arr = [1,2,3,4,5,6,7,8,9,10] let B = [[(arr[1 ] = обр[8])],[(обр[8] = обр[1])]]

person ychris    schedule 11.12.2020
comment
Из приведенной выше проблемы я пытался поменять местами два массива, и когда я console.log(arr), сообщение было ошибкой ссылки - person ychris; 11.12.2020
comment
Пожалуйста, рассмотрите открытый новый вопрос. - person Evgenij Reznik; 11.12.2020