差异TypeError和ReferenceError

时间:2012-09-25 18:58:43

标签: javascript firefox typeerror referenceerror

之间有什么区别
TypeError: ... is undefined

ReferenceError: ... is not defined

5 个答案:

答案 0 :(得分:15)

当您尝试使用根本不存在的变量时,会发生ReferenceError

当变量存在时会发生TypeError,但您尝试执行的操作不适合它包含的值类型。如果详细消息显示“未定义”,则如果您的值为特殊undefined值,并且您尝试访问其属性,则会发生这种情况。

有关此问题的一些讨论,请参阅http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/

答案 1 :(得分:13)

以下是JavaScript error types

JavaScript 1.5规范定义了六种主要错误类型,如下所示:

EvalError:在以错误方式使用eval()函数时引发。

RangeError:当数字变量超出其允许范围时触发。

ReferenceError:使用无效引用时引发。

SyntaxError:在解析JavaScript代码时发生语法错误时引发。

TypeError:当变量类型不符合预期时引发。

强文本URIError:encodeURI()decodeURI()函数的使用方式不正确时引发。

答案 2 :(得分:3)

请考虑以下代码:

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异常。

答案 3 :(得分:1)

参考错误是示波器解析失败错误。在TypeError中,范围解析成功,但是我们尝试执行 对不允许的变量的非法操作。

以下示例将对这两种类型的错误给出清晰的思路。

function foo(a){
    console.log(a+b);//ReferenceError b is not defined
    b=a;
}
foo(2);

执行上述函数会导致TypeError,因为在编译器到达 console.log(a + b)语句时未定义 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 被吊起,因此在console.log(a + b.toString())行之前具有未定义的值。在此行中,我们尝试将此时未定义的 b 转换为字符串,这样做,我们尝试执行非法操作,因此引发TypeError。变量 b 的范围查找成功,但是我们执行了非法操作。因此引发了TypeError。

答案 4 :(得分:0)

看上面关于引用错误的解释,什么可能导致此代码的引用错误 const arr = [1,2,3,4,5,6,7,8,9,10] 让B = [[(arr [1] = arr [8])],[(arr [8] = arr [1])]] p