无法理解条件执行流程

时间:2015-09-29 09:58:11

标签: javascript

一个简单的js片段。为什么总是提醒

'结果为空'

根据我的理解,if阻止应该执行,因为result!=""true并且警告

'结果不为空'。

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

3 个答案:

答案 0 :(得分:2)

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

这在规范中的Abstract Equality Comparison算法中有详细说明:

  1. ReturnIfAbrupt(X)。
  2. ReturnIfAbrupt(Y)。
  3. 如果Type(x)与Type(y)相同,那么 返回执行Strict Equality Comparison x === y。
  4. 的结果
  5. 如果x为null且y未定义,则返回true。
  6. 如果x未定义且y为null,则返回true。
  7. 如果Type(x)是Number而Type(y)是String, 返回比较结果x == ToNumber(y)。
  8. 如果Type(x)是String而Type(y)是Number, 返回比较结果ToNumber(x)== y。
  9. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  10. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  11. 如果Type(x)是String,Number或Symbol,Type(y)是Object,那么 返回比较结果x == ToPrimitive(y)。
  12. 如果Type(x)是Object而Type(y)是String,Number或Symbol,那么 返回比较结果ToPrimitive(x)== y。
  13. 返回false。
  14. 从上面我们可以看到,如果我们从false""开始,那么:

    • 我们按照步骤8,将false转换为0,然后重新开始0 != ""
    • 我们按照步骤6,将""转换为0,然后重新开始0 != 0
    • 我们按照步骤3获得结果false(因为我们正在执行!=,而算法是根据==)定义的。

答案 1 :(得分:1)

Javascript检查truthy值。

false != "" 

是假的

false !== ""

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

答案 2 :(得分:1)

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

您需要使用严格的比较,即!==进行比较。 result !== ""会产生true