2009-10-23 54 views
5

我始终认为,一个if语句基本上是比较它类似于== true说法。然而在Firebug下面的实验证实了我最担心的,之后15年编写JavaScript我仍然不知道跆拳道是怎么回事:什么是JavaScript的语义的声明如果

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

我的世界观是一团糟这里。我可以运行一些实验来了解更多信息,但即使如此,由于害怕浏览器的怪癖,我仍然会失眠。这是在某个地方的规格?它是否一致跨浏览器?我会永远掌握JavaScript吗?

+0

离奇,我很好奇,看看答案 – theraccoonbear 2009-10-23 21:26:17

回答

7

“如果两个操作数的类型不同,JavaScript会转换操作数,然后进行严格比较,如果任一操作数是数字或布尔值,则操作数会转换为数字;如果任一操作数是字符串,另一个被转换为一个字符串。“

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators

所以第一个广告:

Number(" ")==Number(true) 

,而第二个则是这样评价:

if(Boolean(" ")==true) console.log("wtf") 
+0

这是最明智的解释。 if语句转换为布尔值。如果有人可以找到此行为的规范,则可获得奖励积分。 – gtd 2009-10-23 21:46:59

+1

好,Mozilla的文档有以下说关于转换发生在if语句:“这不是未定义任何值,NULL,0,NaN的,或空字符串(”“),任何对象,包括一个值为false的布尔对象,在传递给条件语句时评估为true。“ – kloffy 2009-10-23 21:58:02

+0

而这个关于使用布尔(值)转换:“如果省略值或为0,-0,空,假,NaN时,未定义的,或空字符串(”“),所述物体具有虚假的初始值。 “ – kloffy 2009-10-23 21:58:34

3

我猜测,这是这是一个问题,而不是第二第一部分。

它可能做一些奇怪的铸造(最有可能的,true被转换为字符串,而不是" "被转换为一个布尔值。

什么是对Boolean(" ")

+0

我的第一反应是这样,我认为你是对的。 – Jonas 2009-10-23 21:31:00

+0

好吧,神圣的战争已经被编程语言的真实性定义所延续,但在JavaScript中,我只是假设==既然是铸造和===是完全匹配,==真实将是真实性的自然定义。 – gtd 2009-10-23 21:32:17

+0

布尔( “ ”)=>真 布尔(“”)=>假 – gtd 2009-10-23 21:37:03

0

我建议使用萤火回报== =只要有可能,如果仅仅是为了避免生存危机。

+0

这是纯粹的愚蠢。 String.prototype.f = function(){return this}; “foo”.f()===“foo”//结果如何?身份是身份。这是一个特例,不是正常情况。 – 2009-10-23 21:49:11

3

JavaScript可以是古怪的事情是这样的。需要注意的是JavaScript有==而且===。我本来以为

" " == true 

true,但

" " === true 

false===运营商不会进行转换;它会检查运营商两侧的值和类型是否相同。 ==确实将'truthy'值转换为true和'falsy'值为false。

这可能是答案 - 从JavaScript Comparison Operators(Mozilla的文档):

等于(==)

如果两个操作数是相同类型的不是,JavaScript的转换操作数,然后进行严格的比较。如果任一操作数是数字或布尔值,则操作数将转换为数字;如果其中一个操作数是字符串,另一个转换为字符串

强烈推荐:Douglas Crockford on JavaScript

+0

良好的联系,我有Javascript:好的部分,但我不知道它跑到哪里。 – gtd 2009-10-23 21:34:02

2

答:aTruthyValue和真实是不一样的。

硒if语句很容易:

if(aTruthyValue) { 
    doThis 
} else { 
    doThat 
} 

现在它只是定义什么是真值。不幸的是,真值不是简单的“==真”或“===真”。

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

+1

+1了最直接的答案,以及作为* actual * spec的链接! – 2009-10-23 22:08:40