2015-09-29 35 views
0

简单的js代码片段。为什么总是警惕无法理解条件执行流程

“结果为空”

按我的理解,if块应该得到执行,因为result!=""true和警觉

“结果不空”。

<script> 
var result = false; 
if(result != "") 
alert('result is not empty') 
else 
alert('result is empty') 
</script> 
+0

因为“”是一个虚假值。 – jalooc

回答

2

这是因为!=做了隐式类型转换。如果你使用严格的版本,!==,它会做你的期望。但松散版本!=会将这两个操作数转换为数字,并且""false都会转换为0,因此"" != false为false,因为它最终(通过一系列卷积)为0 != 0

此详细被布置在Abstract Equality Comparison算法在本说明书中:

  1. ReturnIfAbrupt(X)。
  2. ReturnIfAbrupt(y)。
  3. 如果Type(x)与Type(y)相同,则返回 执行严格平等比较x === y的结果。
  4. 如果x为null且y未定义,则返回true。
  5. 如果x未定义且y为null,则返回true。
  6. 如果Type(x)是Number和Type(y)是String,则返回比较结果x == ToNumber(y)。
  7. 如果Type(x)是String并且Type(y)是Number,则 返回比较结果ToNumber(x)== y。
  8. 如果Type(x)是布尔型,则返回比较结果ToNumber(x)== y。
  9. 如果Type(y)是布尔型,则返回比较结果x == ToNumber(y)。
  10. 如果Type(x)是String,Number或Symbol且Type(y)是Object,则 返回比较结果x == ToPrimitive(y)。
  11. 如果Type(x)是Object且Type(y)是String,Number或Symbol,则 返回比较结果ToPrimitive(x)== y。
  12. 返回false。

我们可以从上面看到,如果我们用false""展开,取出,然后:

  • 我们按照步骤8,转换false0,并与0 != ""
  • 重新开始我们按照步骤6,将""转换为0,然后再次启动0 != 0
  • 我们按照步骤3获得结果false (因为我们在做!=,而算法是根据==定义的)。
+0

谢谢@Crowder的详细解答。保持。感谢您的链接。 – Keerthivasan

1

Javascript检查truthy值。

false != "" 

是假

false !== "" 

是真实的,所以你可以尝试一下。

1

在JavaScript中,两个虚假的东西可以相等,如在这种情况下,其中result != ""产生false

您需要使用严格比较,即!==进行比较。 result !== ""收率为true

+1

这是另一回事吗? 'false!=“”'产生'false'。 – Risadinha

+0

@Risadinha谢谢你,推理是正确的,但我换了真假!我纠正了它 – JotaBe