javascript - 未定义类型在 JS 中的行为不同

标签 javascript

我只是尝试这个 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/

相关文章:

javascript - 如何将字符串分割为两个或多个单词?

javascript - Codeigniter:由于tinymce文本区域而没有进行验证

javascript - 为什么源代码中看不到 DOM 结构?

javascript - 如何使用 JavaScript 将大量数字格式化为字符串

javascript - 在ajax加载的div中注入(inject)脚本

javascript - Flot 未正确显示时间戳/日期

javascript - .addEventListener 中的计时器不起作用?

javascript - 谷歌函数 : accessing firestore database of another project

javascript - 单击 jquery 中的按钮更改内容

javascript - 如何根据键值更新 javascript 数组中的行?