之间有什么区别
TypeError: ... is undefined
和
ReferenceError: ... is not defined
答案 0 :(得分:15)
当您尝试使用根本不存在的变量时,会发生ReferenceError
。
当变量存在时会发生TypeError
,但您尝试执行的操作不适合它包含的值类型。如果详细消息显示“未定义”,则如果您的值为特殊undefined
值,并且您尝试访问其属性,则会发生这种情况。
有关此问题的一些讨论,请参阅http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/。
答案 1 :(得分:13)
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