我一直认为if语句基本上比较了它与== true
类似的论点。然而,Firebug中的以下实验证实了我最糟糕的恐惧 - 在写了15年的Javascript之后我仍然没有线索WTF正在进行:
>>> " " == true
false
>>> if(" ") console.log("wtf")
wtf
我的世界观在这里一片混乱。我可以运行一些实验来了解更多信息,但即使这样,我也会因为害怕浏览器怪癖而失眠。这是某个规格吗?它是否一致的跨浏览器?我会掌握javascript吗?
答案 0 :(得分:7)
“如果两个操作数的类型不同,则JavaScript转换操作数然后应用严格比较。如果操作数是数字或布尔值,则操作数转换为数字;如果任一操作数是字符串,则另一个一个被转换为字符串。“
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators
所以第一个做的是:
Number(" ")==Number(true)
虽然第二个评估如下:
if(Boolean(" ")==true) console.log("wtf")
答案 1 :(得分:3)
我猜这是问题的第一部分,而不是第二部分。
它可能会做一些奇怪的转换(很可能,true
被强制转换为字符串而不是" "
被强制转换为布尔值。
FireBug为Boolean(" ")
返回什么?
答案 2 :(得分:3)
JavaScript可能会像这样的事情古怪。请注意,JavaScript包含==
,但===
。我原以为是
" " == true
将是true
,但
" " === true
将是false
。 ===
运算符不进行转换;它检查运算符两侧的值和类型是否相同。 ==
会将'truthy'值转换为true,将'falsy'值转换为false。
这可能是答案 - 来自JavaScript Comparison Operators(Mozilla文档):
等于(==)
如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,则操作数将转换为数字;如果任一操作数是一个字符串,另一个操作数将转换为字符串
答案 3 :(得分:2)
答案:aTruthyValue和true不一样。
if语句的语义很简单:
if(aTruthyValue) {
doThis
} else {
doThat
}
现在只是对真实价值的定义。遗憾的是,不是简单的“== true”或“=== true”。
ECMA-262 1.5 第9.2节解释了什么值是真实的,哪些不是真的。
答案 4 :(得分:0)
我建议尽可能使用===,只是为了避免存在危机。