给出以下代码:
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
1
NaN
它被强制转换为布尔值。任何非空字符串的求值为true。
根据[ECMAScript语言规范]:
## 12.5 if声明
if
### 语义学
生产 IfStatement :if ( Expression ) Statement else 语句 的评估如下:
if (
)
else
## 9.2 ToBoolean
根据表11,抽象操作ToBoolean将其参数转换为Boolean类型的值:
### 表11-ToBoolean转换
未定义: false 空值: false 布尔值:结果等于输入参数(不转换)。 Number:如果参数为 +0 , -0 或 NaN ,则结果为 false ;否则结果为 true 。 字符串:如果参数为空字符串(其长度为零),则结果为 false; 否则为 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)