2012-07-18 79 views
4

怎样的JavaScript如果条件决定了它的价值?看下面这个例子:怎么做,如果条件评估它的价值在JavaScript

<script type="text/javascript"> 

var bar = ("something" == true); 
alert(bar); // 1 

if ("something") { 
    alert("hey!"); // 2 
} 

</script> 

为什么我到一个点// 2,而在// 1“酒吧”是假的?

我可以看到bar值获取几乎相同的方式计算的,如果条件,或不?

+0

这里的问题可能是'=='在'==='上的不可预测性。 – 2012-07-18 16:59:28

+1

Ahh the [JavaScript truth table](http://stackoverflow.com/a/1998224/419956)... – Jeroen 2012-07-18 16:59:51

+0

[在Javascript中,为什么“0”等于false,但不是自身错误?] (http://stackoverflow.com/questions/7615214/in-javascript-why-is-0-equal-to-false-but-not-false-by-itself) – 2012-07-18 17:01:37

回答

2

这是因为JavaScript的强制类型转换引擎是如何工作的。当你说

"something" == true 

JavaScript调用ToNumber在你的“东西”字符串来比较它与布尔值。 “某物”会产生不等于真的NaN。

然而,只有

if("something") 

检查如果字符串是truthy。因为它不是一个空字符串,它实际上是真的。

这里更多:http://webreflection.blogspot.co.il/2010/10/javascript-coercion-demystified.html

4

"something" == true是假的,因为字符串和布尔必须强迫可以比较的类型。然而,if("something")工作,因为一个非空字符串是truthy值。

1

这是因为在第一种情况下,JavaScript的会尝试以比较作为字符串(点亮"something" == "true"),这将是错误的。

但是,在第二种情况下,表达式的结果为"something",当投射到布尔值时,结果为true

See here for details.

+0

但是'“true”== true'也会评估为'false'。如果它只是比较字符串(就像你指出的那样),这应该是'真实的'。 – Sujay 2012-07-18 17:15:22

1
if("something") 

的声明之上将返回true因为"something"是一个有效的字符串。它会返回false,如果它是一个空字符串("")。这也恰好与数(0回报false,但1回报true)。

"something"==true中,两者都转换为字符串,然后检查(“something”==“true”,这将返回false)。

0

事情并不是如此JavaScript处理如果语句,因为它是如何JavaScript强制对象类型。

一个非空字符串是truthy,虽然它不等于true。如果您尝试"something != false,您可以检查这个,它返回true

正因为如此,很多人主张在JavaScript中严格比较以避免这些缺陷。

例如:

"something" !== false // true 
"something" === true // false 
"" === false   // false 
0 === false   // false 

要读了这一点,有一吨的物品。我推荐Douglas Crockford

+0

现在我很困惑,为什么''something == == false'和'“something == true'都是错误的? – 2012-07-18 17:22:05

+0

因为当== ==试图做它的类型强制的事情时,'true','false'和''something''总是出现不同的值。在这种情况下并不奇怪,考虑到“东西”不是一个布尔值(因此比较它们是没有意义的)。 – cHao 2012-07-18 17:26:58

+0

再次阅读,它说'(“something”!= false)'和'(“something”== false)'' – 2012-07-18 18:04:09