比较运算符在JavaScript中给出特殊结果

时间:2018-04-14 19:19:41

标签: javascript

我的一位朋友今天告诉我打开Chrome控制台并查看我在下面报告的三个JavaScript命令的输出(带有相应的输出)。

> Boolean([])
< true
> Boolean("")
< false
> [] == ""
< true

当我告诉他这可能是一个错误时,他回答说这是一个着名的事情,JavaScript开发人员应该知道它。

这是真的吗?是否有任何逻辑可以证明上述输出是正确的,或者它只是语言的错误?

3 个答案:

答案 0 :(得分:2)

要比较[]"",JavaScript会尝试将它们设置为相同的类型,在本例中为:String。

你会注意到与此类似的结果(这对我们来说很有意义):

[].toString() == "" // true

答案 1 :(得分:2)

哇!真是个好问题!从另一种语言来到JavaScript时,这是如此疯狂的行为吗?或者,即使JavaScript是你的第一语言,它仍然是疯狂的。但它确实是按预期工作的语言。

对这种行为有一个惊人的答案/解释以及它发生的原因here。简而言之,当您使用相等运算符(==)时,JavaScript会进行大量的类型转换和有趣的事情。更常见的情况是,您可能希望使用身份运算符(===),因为它执行更严格的比较,并且JavaScript在使用时不会尝试在表面下进行任何类型转换或魔术。

答案 2 :(得分:2)

Double equals执行类型强制。在检查相等性之前,它会尝试将每个转换为通用类型。这就是为什么建议JavaScript开发人员总是使用三等号(===)来执行严格的类型相等比较。

在这种情况下,[]将被转换为空字符串,该字符串被视为虚假,就像它被比较的空字符串一样。在下面的例子中可以看到相同的情况:

[5]==5
true