给出以下代码:
if ("string") {
console.log('true!');
}
//logs "true" to the console
if ("string"==true) {
console.log('true!');
}
//doesn't log anything
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我以为"string"是被转换成一个数字,就像布尔一样.因此true变得1和"string"变NaN.第二个if语句有意义,但我不明白为什么第一个语句会导致内部循环被评估.这里发生了什么?
Joh*_*ica 57
它被转换为布尔值.任何非空字符串的计算结果为true.
12.5
if声明语义
生产IfStatement:
if (Expression)Statementelse语句的计算方法如下:
- 设exprRef是评估Expression的结果.
- 如果ToBoolean(GetValue(exprRef))为真,那么
- 返回评估第一个Statement的结果.
- 其他,
- 返回评估第二个Statement的结果.
9.2 ToBoolean
抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:
表11 - ToBoolean转换
Undefined:false
Null:false
Boolean:结果等于输入参数(无转换).
Number:如果参数为+ 0,-0或NaN,则结果为false ; 否则结果是真的. String:如果参数为空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)
Run Code Online (Sandbox Code Playgroud)
非空字符串是真实的,但不一定等同于true.
==是一个"软"平等运算符.
它使用类型强制来比较两个等价的对象.
以下所有情况均属实:
42 == "42"
0 == false
0 == ""
[] == ""
{} == "[object Object]"
"1" == true
Run Code Online (Sandbox Code Playgroud)
Aribtrary字符串不等于任何原始值.然而
当你写作时if (something),if如果something是"真实的" 将执行.
除以下内容外,所有值都是真实的:
false0 NaN""nullundefined