【问题标题】:why does if("string") evaluate "string" as true but if ("string"==true) does not?为什么 if("string") 将 "string" 评估为 true 但 if ("string"==true) 不评估?
【发布时间】:2011-02-08 00:53:20
【问题描述】:

给定以下代码:

if ("string") {
    console.log('true!');
}
//logs "true" to the console
if ("string"==true) {
    console.log('true!');
}
//doesn't log anything

为什么会这样?我认为"string" 被转换为一个数字,布尔值也是如此。所以true 变成1"string" 变成NaN。第二个 if 语句是有道理的,但我不明白为什么第一个语句会导致内部循环被评估。这是怎么回事?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    它被转换为布尔值。任何非空字符串的计算结果都是 true。

    来自ECMAScript Language Specification

    12.5 if 声明

    语义

    产生式 IfStatement: if ( Expression ) Statement else Statement 被评估为如下:

    1. exprRef 为计算 Expression 的结果。
    2. 如果 ToBoolean(GetValue(exprRef)) 为 true,则
      • 返回评估第一个语句的结果。
    3. 否则,
      • 返回评估第二个语句的结果。

    9.2 ToBoolean

    抽象操作 ToBoolean 根据表 11 将其参数转换为布尔类型的值:

    表 11 - ToBoolean 转换

    未定义:错误
    空:false
    布尔值:结果等于输入参数(无转换)。
    Number:如果参数为 +0-0NaN,则结果为 false;否则结果为 true
    String:如果参数为空字符串(长度为零),则结果为false; 否则结果为 true
    对象:


    == 运算符而言,它很复杂,但其要点是,如果将数字与非数字进行比较,则非数字将转换为数字。如果将布尔值与非布尔值进行比较,则布尔值首先转换为数字,然后应用上一句。

    有关详细信息,请参阅第 11.9.3 节。

    // Call this x == y.
    if ("string" == true) 
    
    // Rule 6: If Type(y) is Boolean,
    //         return the result of the comparison x == ToNumber(y).
    if ("string" == Number(true))
    
    // Rule 5: If Type(x) is String and Type(y) is Number,
    //         return the result of the comparison ToNumber(x) == y.  
    if (Number("string") == Number(true))
    
    // The above is equivalent to:
    if (NaN == 1)
    
    // And NaN compared to *anything* is false, so the end result is:
    if (false)
    

    【讨论】:

    • 触摸。 +1 用于找到确切的案例。
    • toNumber方法是否只适用于== then?
    【解决方案2】:

    非空字符串是真实的,但不一定等同于true


    == 是一个“软”相等运算符。
    它使用类型强制来比较两个等价对象是否相等。

    以下都是正确的:

    42 == "42"
    0 == false
    0 == ""
    [] == ""
    {} == "[object Object]"
    "1" == true
    

    任意字符串不等同于任何原始值。 不过


    当您编写if (something) 时,如果something 是“真实的”,则if 将执行。

    除以下值外,所有值都是真实的:

    • false
    • 0
    • NaN
    • ""
    • null
    • undefined

    【讨论】:

      【解决方案3】:
      if ("string"===true)
      

      应该这样写。

      【讨论】:

        【解决方案4】:

        "string" 是一个不为空的字符串。在 JavaScript 中,不为 null 的所有内容都评估为“真”。所以: if("string") 与 if("string" != null) 相同,但 "string" 不正确,它仍然是一个字符串值。

        【讨论】:

          【解决方案5】:

          我认为这是因为在第一个示例中,您的“字符串”是一个非空对象,在此上下文中转换为 true,而在第二个示例中,您询问此 String 对象是否相同作为布尔对象,它不是,所以它转换为假。

          【讨论】:

            【解决方案6】:
            if ("string") {
                console.log('true!');
            }
            

            您可能已经知道,if 计算一个布尔表达式。所以它检查

            if((Boolean)"string")
            

            因为 (bool)string 为真,它通过了。但是在

            的情况下
            if ("string"==true) {
                console.log('true!');
            }
            

            你试图将一个字符串等同于一个布尔值,这显然会比较它们并返回 false。

            【讨论】:

              【解决方案7】:

              简单:

              if("string") 被评估为布尔值。任何不是false 的值都是true,不会转换为数字或任何类似的值。

              "string" 与布尔值true 进行比较显然会产生false

              【讨论】:

                【解决方案8】:

                从 ECMA 262 参考中,如果您将字符串隐式转换为布尔值,并且该字符串不是空字符串,它将评估为 true。

                查看here

                【讨论】:

                  【解决方案9】:

                  因为它的 JavaScript 就是这样。查看此页面右侧的所有相关问题。

                  【讨论】:

                  • “因为 JavaScript 就是这样。”既不具建设性也不提供信息。将问题标记为重复问题会有所帮助,但责备好奇的新程序员则无济于事。
                  • 无用的“答案”.. 尝试更有建设性
                  • “我讨厌javascript ...愤怒”可以认同这样的答案:p
                  猜你喜欢
                  • 2020-08-15
                  • 2015-04-16
                  • 2020-04-13
                  • 2019-05-27
                  • 2013-06-01
                  • 1970-01-01
                  • 2013-05-03
                  • 2017-10-27
                  相关资源
                  最近更新 更多