9

和有什么区别

TypeError: ... is undefined

ReferenceError: ... is not defined

?

4

5 回答 5

31

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

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

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

于 2012-09-25T19:25:46.300 回答
15

以下是JavaScript 错误类型

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

EvalError:以不正确的方式使用 eval() 函数时引发。

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

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

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

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

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

于 2014-06-05T07:03:11.510 回答
5

考虑以下代码:

function foo(){
 var d=1234;
 console.log(d.substring(1,2));     
}
foo();

这将有以下输出:

异常:TypeError: d.substring is not a function 这是因为我们为给定的操作(需要字符串的子字符串)使用了错误的类型(数字)。当值不属于预期类型时,TypeError 对象表示错误.

function foo(){
 var d=1234;
 console.log(c);
}
foo();

这将有以下输出:

异常:ReferenceError:c 未定义这是因为变量“c”的引用在本地或全局范围内都不存在,我们仍在尝试使用它。访问不存在的变量时会引发 ReferenceError 异常.

于 2015-07-11T07:52:16.813 回答
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()) 行之前有一个 undefined 值。在这一行中,我们尝试将此时未定义的b转换为字符串,这样做,我们尝试执行非法操作,因此抛出 TypeError。变量b的作用域查找成功,但我们执行了非法操作。因此抛出了 TypeError。

于 2020-04-15T18:56:13.587 回答
0

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

于 2020-12-11T09:53:28.777 回答