代码之家  ›  专栏  ›  技术社区  ›  gtd

javascripts if语句的语义是什么

  •  5
  • gtd  · 技术社区  · 17 年前

    我一直认为一个if语句本质上比较了它的论点类似于 == true . 然而,在Firebug中进行的以下实验证实了我最担心的事情,在写了15年的javascript之后,我仍然不知道wtf会继续下去:

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

    我的世界观在这里一团糟。我可以做一些实验来了解更多信息,但即使那样,我也会因为害怕浏览器的怪癖而失眠。这个在什么地方吗?跨浏览器是否一致?我会掌握javascript吗?

    5 回复  |  直到 17 年前
        1
  •  7
  •   kloffy    17 年前

    “如果两个操作数不是同一类型,则javascript将转换这些操作数,然后应用严格的比较。如果其中一个操作数是数字或布尔值,则操作数将转换为数字;如果其中一个操作数是字符串,则另一个操作数将转换为字符串。”

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

    所以第一个问题是:

    Number(" ")==Number(true)
    

    第二个是这样评价的:

    if(Boolean(" ")==true) console.log("wtf")
    
        2
  •  3
  •   DVK    17 年前

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

    它可能会做一些奇怪的演员(很可能, true 转换为字符串而不是 " " 转换为布尔值。

    萤火虫回来干嘛 Boolean(" ") ?

        3
  •  3
  •   Jesper    17 年前

    像这样的事情,javascript可能很奇怪。注意,javascript有 == 而且 === . 我本以为

    " " == true
    

    将是 true 但是

    " " === true
    

    将是 false . 这个 = = 运算符不进行转换;它检查运算符两边的值和类型是否相同。这个 = 是否将“真实”值转换为“真”,将“虚假”值转换为“假”。

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

    相等(=)

    如果两个操作数不是同一类型,则javascript将转换这些操作数,然后应用严格的比较。如果其中一个操作数是数字或布尔值,则操作数将转换为数字;如果其中一个操作数是字符串,则另一个操作数将转换为字符串。

    强烈建议: Douglas Crockford on JavaScript .

        4
  •  2
  •   user166390    17 年前

    答:atruthyValue和true不一样。

    if语句的语义很简单:

    if(aTruthyValue) {
      doThis
    } else {
      doThat
    }
    

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

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

        5
  •  0
  •   Adam Bard    17 年前

    我建议尽可能使用==来避免存在的危机。