在 Javascript 中检查 undefined'ness 时,我应该使用 != 还是 !==?

Posted

技术标签:

【中文标题】在 Javascript 中检查 undefined\'ness 时,我应该使用 != 还是 !==?【英文标题】:When checking for undefined'ness in Javascript, should I use != or !==?在 Javascript 中检查 undefined'ness 时,我应该使用 != 还是 !==? 【发布时间】:2020-05-11 17:27:36 【问题描述】:

当我想确保定义了变量x 时,在使用它之前,我使用:

if (typeof x !== "undefined") 
    // do stuff with x

但我注意到其他人,例如在这个question 中,使用!== 而不是!= 进行比较。我应该使用哪一个,为什么?

注意:我意识到我可以使用!==。问题是我是否应该(以及行为上是否会有任何差异)。

【问题讨论】:

这能回答你的问题吗? Which equals operator (== vs ===) should be used in javascript comparisons? @funnydman:不完全是。我不知道类型转换在这里是否有意义。 我个人会使用if (x != undefined),因为这也会检查null,并且在大多数编程情况下nullundefined几乎是等价的。 在你的情况下 - 一点都不重要。 typeof 总是返回一个字符串,所以无论你是否使用严格相等,都不会有任何区别。 @Pointy:如果变量从未被声明过,那将会失败。 【参考方案1】:

实际上,最好的方法是检查一个值是否为falsy,并基于MDN this is the list 的虚假值:

false 关键字false 0 数字零 0n BigInt 用作布尔值时,遵循与数字相同的规则。 0n 是假的。 "", '', ``

这是一个空字符串(字符串的长度为零)。 JavaScript 中的字符串可以用双引号 ""、单引号 '' 或模板文字 ``.

来定义

null null - 没有任何值

undefined undefined - 原始值 NaN NaN - 不是数字

所以根据您的代码,您可以做的很简单:

if (!x)  // check for all the falsy values.
    // do stuff with x

另一方面,你问!=!==的区别,基本上举几个例子你就能看出区别:

0 == false   // true, because false is equivalent of 0

0 === false  // false, because both operands are of different type

2 == "2"     // true, auto type coercion, string converted into number

2 === "2"    // false, since both operands are not of same type

正如@VLAZ 评论所提到的,这些情况只有在变量x 被定义的情况下才有效,否则会出现以下错误:

"Uncaught ReferenceError: x is not defined"

因此,在您的情况下,您只能使用 !=,因为您将比较 stringstring,您将不必检查变量是否已创建。

if (typeof x != "undefined") 
    // do stuff with x

【讨论】:

if(!x) 将 1. 捕获可能是合法值的 false0。如果要检查undefined,则检查undefined。根据我的经验,广泛的检查产生的错误多于节省的时间。当然,您花了几秒钟编写代码,甚至可能花几分钟时间真正思考和设计代码应该做什么和应该做什么。但随后你花费了大约 10 多个工时,有人发现 0 以某种方式受到不应该以应有的方式对待或某事,调查,写一张票,有人拿它,调查,然后对意图进行逆向工程。 此外,如果 x 根本没有定义,if(!x) 将抛出 ReferenceError。 OP 明确提到的是一种可能性。 是的@VLAZ我编辑了答案,并在x未定义的情况下添加了注释。与您的第一个评论有关,我知道关于明确检查某些内容,但通常我描述了检查虚假值的情况,我无法为他想要检查的每种类型的变量创建一个场景,我认为这是责任正如您提到的,开发人员的每个案例都会有不同的检查,但这更像是一个普遍的答案。 只有你的最后一段是对我问题的有效答案,其余的与其他问题有关......【参考方案2】:

正如 VLAZ 的评论中所指出的,typeof 运算符保证返回一个字符串。如果将结果与另一个字符串进行比较,那么=====(或!=!==)将执行完全相同的操作。

【讨论】:

以上是关于在 Javascript 中检查 undefined'ness 时,我应该使用 != 还是 !==?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript Javascript检查undefined或null对象/变量

如何在javascript中检查未定义的类型[重复]

如何检查 JavaScript 中的“未定义”? [复制]

如何检查 JavaScript 中的“未定义”? [复制]

如何检查javascript中的对象中是不是存在键[重复]

如何在 JavaScript 中检查空/未定义/空字符串?