Javascript 差异类型错误和引用错误

Javascript 差异类型错误和引用错误,javascript,firefox,typeerror,referenceerror,Javascript,Firefox,Typeerror,Referenceerror,它们之间有什么区别 TypeError: ... is undefined 及 ?当您试图使用一个根本不存在的变量时,会发生引用错误 变量存在时,会发生TypeError,但您尝试执行的操作不适合它包含的值类型。在详细消息显示“未定义”的情况下,如果您有一个值为特殊undefined值的变量,并且您尝试访问该变量的属性,则可能会发生这种情况 有关这方面的一些讨论,请参阅。以下是: JavaScript 1.5规范定义了六种主要错误类型,如下所示: EvalError:当eval()函数的使用方

它们之间有什么区别

TypeError: ... is undefined


当您试图使用一个根本不存在的变量时,会发生
引用错误

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

有关这方面的一些讨论,请参阅。

以下是:

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

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

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

引用错误:在使用无效引用时引发

语法错误:在解析JavaScript代码时出现语法错误时引发

类型错误:当变量的类型与预期不符时引发


strong文本URI错误:
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();
这将有以下输出:

异常:引用错误:未定义c
这是因为变量“c”的引用在本地或全局作用域中都不存在,我们仍在尝试使用它。当访问不存在的变量时,将引发ReferenceError异常。

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

下面的示例将对这两种类型的错误给出一个清晰的概念

function foo(a){
    console.log(a+b);//ReferenceError b is not defined
    b=a;
}
foo(2);
执行上述函数会导致TypeError,因为在编译器到达控制台.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,考虑下面的代码块,像往常一样,我们将函数Fo.

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。

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

ECMAScript标准定义了每种错误类型发生的场景。有关这些场景的完整列表。您能提供抛出这些错误的代码示例吗?从上面的问题中,我试图交换两个数组的位置,当我控制台。log(ARR)消息是引用错误时,请考虑打开一个新问题。
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);