为什么if(“string”)将“string”评估为true,但if(“string”== true)不是?

时间:2011-02-07 16:22:18

标签: javascript

给出以下代码:

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语句有意义,但我不明白为什么第一个语句会导致内部循环被评估。这是怎么回事?

9 个答案:

答案 0 :(得分:56)

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

来自ECMAScript Language Specification

  

12.5 if语句

     

语义

     

生产 IfStatement if ( 表达式 ) 声明 else 声明< / em>评估如下:

     
      
  1. exprRef 成为评估 Expression 的结果。
  2.   
  3. 如果ToBoolean(GetValue( exprRef ))是 true ,那么   
        
    • 返回评估第一个 Statement 的结果。
    •   
  4.   
  5. 否则,   
        
    • 返回评估第二个 Statement 的结果。
    •   
  6.         

    9.2 ToBoolean

         

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

         

    表11 - ToBoolean Conversions

         

    未定义: false
      空:错误
      Boolean:结果等于输入参数(无转换)   数字:如果参数为 +0 -0 NaN ,则结果为 false ;否则结果是 true   String:如果参数为空String(其长度为零),则结果为 false ;   否则结果是 true   对象: 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 :(得分:8)

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


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

以下所有情况均属实:

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

Aribtrary字符串不等于任何原始值。 然而


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

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

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

答案 2 :(得分:1)

if ("string"===true)

应该这样写。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我认为这种情况正在发生,因为在第一个示例中,您的“字符串”是一个非null对象,在此上下文中转换为true,而在第二个示例中,您询问此String对象是否相同作为布尔对象,它不是,因此它转换为false。

答案 5 :(得分:0)

if ("string") {
    console.log('true!');
}

您可能已经知道,如果计算布尔表达式。所以检查

if((Boolean)"string")

因为(bool)字符串为true,所以它会通过。但是在

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

您正在尝试将字符串与bool等同,这显然会比较它们并返回false。

答案 6 :(得分:0)

从ECMA 262引用中,如果将String隐式转换为Boolean,并且String不是空String,则它将计算为true。

检查here

答案 7 :(得分:0)

简单:

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

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

答案 8 :(得分:-8)

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