检查是否存在未定义的';在Javascript中,我应该使用吗!=或者!==?

检查是否存在未定义的';在Javascript中,我应该使用吗!=或者!==?,javascript,identity,equality,thunderbird,Javascript,Identity,Equality,Thunderbird,当我想确保变量x已定义时,在使用它之前,我使用: if (typeof x !== "undefined") { // do stuff with x } 但是我注意到,其他人,例如,在这个例子中,使用==而不是=用于比较。我应该使用哪一种,为什么 注意:我意识到我可以使用==。问题是我是否应该(以及行为是否会有任何不同)。正如VLAZ在评论中所指出的,typeof操作符保证返回字符串。如果将结果与另一个字符串进行比较,则=和==(或!=和!=)将执行完全相同的操作。实际上,最好的方法

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

if (typeof x !== "undefined") {
    // do stuff with x
}
但是我注意到,其他人,例如,在这个例子中,使用
==而不是
=用于比较。我应该使用哪一种,为什么


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

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

实际上,最好的方法是检查值是否为
falsy
,并基于falsy值的MDN:

  • false关键字false
  • 0表示数字0
  • 0n BigInt用作布尔值时,遵循与数字相同的规则。0n是falsy。 “,”
  • 这是一个空字符串(字符串长度为零)。JavaScript中的字符串可以用双引号、单引号或模板文本定义

  • null-没有任何值

  • undefined undefined-原语值
  • 楠楠-不是一个数字
因此,根据您的代码,您可以做的只是:

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 comment所述,只有定义了变量
x
时,这些情况才会起作用,否则将出现以下错误:

“未捕获引用错误:未定义x”

因此,在您的情况下,您只能使用
=因为您将比较
string
string
并且您将避免检查变量是否已创建

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

这回答了你的问题吗@芬尼德曼:不完全是。我不知道这里的类型转换是否有意义。我个人会使用
if(x!=undefined)
,因为这也会检查
null
,在大多数编程情况下
null
undefined
几乎是等价的。在您的情况下-一点都不重要
typeof
始终返回一个字符串,因此无论是否使用严格相等,都不会有任何区别。@Pointy:如果从未声明过变量,则该操作将失败。
如果(!x)
将为1。捕获可能是合法值的
false
0
。如果要检查
未定义
,请检查
未定义
。广泛的检查在我的经验中产生了比节省时间更多的错误。当然,您花了几秒钟编写代码,甚至可能花了几分钟实际思考和设计代码将要做什么和应该做什么。但是,如果有人发现
0
在某种程度上没有得到应有的对待,那么你就要花费10多个工时,调查、写一张罚单、有人拿着罚单、调查,然后逆向设计意图。此外,
如果(!x)如果根本没有定义
x
,则
将抛出引用错误。OP明确提到的是一种可能性。是的@VLAZ我编辑了答案,并对未定义
x
的情况进行了注释。关于你的第一条评论,我知道关于明确检查某些东西,但通常我描述了检查falsy值的情况,我不能为他想要检查的每种类型的变量创建一个场景,我认为这是开发人员的责任,正如你提到的,每种情况都有不同的检查,但这是一个比较笼统的回答。只有你的最后一段是对我问题的有效回答,其余部分与其他问题相关。。。