什么是Javascripts的语义如果声明

时间:2009-10-23 21:23:47

标签: javascript

我一直认为if语句基本上比较了它与== true类似的论点。然而,Firebug中的以下实验证实了我最糟糕的恐惧 - 在写了15年的Javascript之后我仍然没有线索WTF正在进行:

>>> " " == true
false
>>> if(" ") console.log("wtf")
wtf

我的世界观在这里一片混乱。我可以运行一些实验来了解更多信息,但即使这样,我也会因为害怕浏览器怪癖而失眠。这是某个规格吗?它是否一致的跨浏览器?我会掌握javascript吗?

5 个答案:

答案 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会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,则操作数将转换为数字;如果任一操作数是一个字符串,另一个操作数将转换为字符串

强烈推荐:Douglas Crockford on JavaScript

答案 3 :(得分:2)

答案:aTruthyValue和true不一样。

if语句的语义很简单:

if(aTruthyValue) {
  doThis
} else {
  doThat
}

现在只是对真实价值的定义。遗憾的是,不是简单的“== true”或“=== true”。

ECMA-262 1.5 第9.2节解释了什么值是真实的,哪些不是真的。

答案 4 :(得分:0)

我建议尽可能使用===,只是为了避免存在危机。