2

我只是在尝试这个 JS 代码 -

if(a){
    console.log("a IS DEFINED")
} else {
    console.log("a IS UNDEFINED")
}

我收到错误 -

ReferenceError: a is not defined

但是当我添加var a它时a IS UNDEFINED

var a;
if(a){
    console.log("a IS DEFINED")
} else {
    console.log("a IS UNDEFINED")
}

// prints a IS UNDEFINED

为什么在这两种情况下它的行为a不同undefined

4

3 回答 3

5

您的困惑是完全可以理解的:这是“未定义”一词的两种不同用法。

未定义的标识符,之间存在差异undefined

当你这样做

if (a)

...您正在尝试获取标识符的值a如果您根本没有定义该标识符,它是一个ReferenceError. JavaScript 引擎根本不知道a它的含义。

相比之下,这:

var a;

定义标识符(作为变量)并赋予它初始值undefined。那么当你这样做时

if (a)

... JavaScript 引擎知道你在说什么:它进入变量a并获取它的值。

如果由于某种原因您需要知道标识符是否已定义并且您不想捕获错误,则允许您采用未定义标识符的类型:

if (typeof a === "undefined")

即使a完全未定义,它也可以工作(没有错误)。undefined但是,它对这两种事物(未定义的标识符和已定义的带值的标识符)没有任何区别。


现在,好像这还不够令人困惑,在“松散模式”中,JavaScript 有一个非常奇怪的行为,我称之为隐式全局的恐怖:如果你分配给一个未定义的标识符(而不是试图读取它的值),而不是给a ReferenceError,它创建一个新的全局变量。值得庆幸的是,我们现在有了 ES5 的“严格模式”,这使得它总是应该出现的错误。:-)

于 2013-10-18T08:50:25.773 回答
0

我建议您使用:

if (typeof a === 'undefined') {
    console.log('a IS UNDEFINED');
} else {
    console.log('a IS DEFINED');
}

undefined如果变量没有值或之前未声明,则变量的类型为。

于 2013-10-18T08:52:14.323 回答
0

简而言之,当您不声明变量但在代码中使用它时,它会得到一个 ReferenceError ,因为您指向的变量不能被引用。但是当您声明变量但不初始化它时,则值是没有定义

例子 :

第一种情况:

if(j){
    //do something
}

没有声明j,而是引用它。所以它会给出一个未定义的错误,因为没有将j作为声明/已知变量。

第二种情况:

var j;
if(j){
    //do something
}

这里j==null将是true,但 if(j) 将等价于 if(null) 与 if(false) 相同,而不是因为jnull。而是因为jundefined

于 2013-10-18T08:54:54.383 回答