我只是尝试这个 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
时它的行为不同?
最佳答案
您的困惑是完全可以理解的:这是“未定义”一词的两种不同用法。
未定义的标识符和值之间存在差异,未定义
。
当你这样做时
if (a)
...您正在尝试获取标识符a
的值。如果您根本没有定义该标识符,那么它就是一个ReferenceError
。 JavaScript 引擎根本不知道 a
的含义。
相比之下,这个:
var a;
定义标识符(作为变量)并为其赋予初始值未定义
。那么当你这样做时
if (a)
...JavaScript 引擎知道您在说什么:它会转到变量 a
并获取其值。
如果由于某种原因您需要知道标识符是否已定义并且您不想捕获错误,则允许您采用未定义标识符的类型:
if (typeof a === "undefined")
即使 a
完全未定义,它仍然有效(没有错误)。但是,它并没有对这两个事物(未定义的标识符和具有 未定义
值的已定义标识符)进行任何区分。
现在,好像这还不够令人困惑,在“松散模式”下,JavaScript 有一个非常奇怪的行为,我称之为 The Horror of Implicit Globals :如果您分配一个未定义的标识符(而不是尝试读取其值),它不会给出ReferenceError
,而是创建一个新的全局变量。值得庆幸的是,我们现在有了 ES5 的“严格模式”,这使得这样做总是应该出现错误。 :-)
关于javascript - 未定义类型在 JS 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19445347/