我的一位朋友今天告诉我打开Chrome控制台并查看我在下面报告的三个JavaScript命令的输出(带有相应的输出)。
> Boolean([])
< true
> Boolean("")
< false
> [] == ""
< true
当我告诉他这可能是一个错误时,他回答说这是一个着名的事情,JavaScript开发人员应该知道它。
这是真的吗?是否有任何逻辑可以证明上述输出是正确的,或者它只是语言的错误?
答案 0 :(得分:2)
要比较[]
和""
,JavaScript会尝试将它们设置为相同的类型,在本例中为:String。
你会注意到与此类似的结果(这对我们来说很有意义):
[].toString() == "" // true
答案 1 :(得分:2)
哇!真是个好问题!从另一种语言来到JavaScript时,这是如此疯狂的行为吗?或者,即使JavaScript是你的第一语言,它仍然是疯狂的。但它确实是按预期工作的语言。
对这种行为有一个惊人的答案/解释以及它发生的原因here。简而言之,当您使用相等运算符(==
)时,JavaScript会进行大量的类型转换和有趣的事情。更常见的情况是,您可能希望使用身份运算符(===
),因为它执行更严格的比较,并且JavaScript在使用时不会尝试在表面下进行任何类型转换或魔术。
答案 2 :(得分:2)
Double equals执行类型强制。在检查相等性之前,它会尝试将每个转换为通用类型。这就是为什么建议JavaScript开发人员总是使用三等号(===)来执行严格的类型相等比较。
在这种情况下,[]将被转换为空字符串,该字符串被视为虚假,就像它被比较的空字符串一样。在下面的例子中可以看到相同的情况:
[5]==5
true