检查是否存在未定义的';在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值的情况,我不能为他想要检查的每种类型的变量创建一个场景,我认为这是开发人员的责任,正如你提到的,每种情况都有不同的检查,但这是一个比较笼统的回答。只有你的最后一段是对我问题的有效回答,其余部分与其他问题相关。。。