为什么if(“string”)评估“string”为真,但如果(“string==真”)不?

给出以下代码:

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语句是有道理的,但我不明白为什么第一个语句会导致内部循环被评估。 这里发生了什么?

它被转换为布尔值。 任何非空string的计算结果为true。

从ECMAScript语言规范 :

12.5 if语句

语义

生成IfStatementif ( Expression ) Statement else 语句的计算方法如下:

  1. exprRef是评估expression式的结果。
  2. 如果ToBoolean(GetValue( exprRef ))为true ,那么
    • 返回评估第一个语句的结果。
  3. 其他,
    • 返回评估第二条语句的结果。

9.2 ToBoolean

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

表11 – 至宝转换

未定义: false
空:
布尔值:结果等于input参数(不转换)。
Number:如果参数为+0-0NaN ,则结果为false ; 否则结果是真的
string:如果参数是空string(长度为零),则结果为false ; 否则结果是真的
对象: 真的


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

细节见第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) 

非空string是真的,但不一定等同于true


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

以下所有情况都是如此:

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

Aribtrarystring不等于任何原始值。 然而


当你写( if (something) ,如果something是“真的”,这个if会执行。

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

  • false
  • 0
  • NaN
  • ""
  • null
  • undefined
 if ("string"===true) 

应该这样写。

“string”是一个不为null的string。 在JavaScript中,一切不为空评估“真”。 所以:if(“string”)和if(“string”!= null)是一样的,但是“string”不是true,它仍然是一个string值。

我想这是因为在第一个例子中,你的“string”是一个非null对象,在这个上下文中翻译为true,而在第二个例子中,你问这个String对象是否与布尔值相同对象,它不是,所以它转化为假。

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

正如你可能已经知道,如果评估一个布尔expression式。 所以它检查

 if((Boolean)"string") 

由于(布尔)string是真的它通过。 但在这种情况下

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

你正试图把一个string等同于一个bool,这显然是比较它们并返回false。

简单:

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

比较"string"到一个布尔值true显然会产生false

http://www.w3schools.com/jS/js_obj_boolean.asp

这个链接解释了原因。

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

在这里检查

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