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

39

给定以下代码:

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

65

它被转换为布尔值。任何非空字符串都会被评估为true。

来自ECMAScript语言规范

12.5 if语句

语义

产生式IfStatement: if (Expression)StatementelseStatement的求值如下:

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

9.2 ToBoolean

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

表11 - ToBoolean转换

Undefined: false
Null: false
Boolean: 结果等于输入参数(无需转换)。
Number: 如果参数为+0-0NaN,则结果为false;否则结果为true
String: 如果参数是空字符串(长度为零),则结果为false; 否则结果为true
Object: 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
触手可及。找到确切的情况,加1分。 - Brad Christie
toNumber方法只适用于==吗? - munchybunch

9

非空字符串为真值,但不一定等同于true


==是一种“软”相等运算符。
它使用类型转换将两个等效对象比较为相等。

以下所有内容均为真:

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

任意字符串并不等同于任何原始值。 然而,当你写下 if (something) 时,如果 something 是“真实”的,那么 if 语句将会被执行。 所有的值都是真实的,除了以下这些:
false 0 NaN "" null undefined

1
if ("string"===true)

应该这样写。


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

正如您可能已经知道的那样,if语句用于对布尔表达式进行评估。因此,它会检查

if((Boolean)"string")

由于(bool)string为真,因此它通过了。但在这种情况下

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

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


0
“string”是一个非空字符串。在JavaScript中,任何不为null的东西都会被评估为“true”。因此:if(“string”)与if(“string”!= null)相同,但“string”不是true,它仍然是一个字符串值。

0
我认为这是因为在第一个例子中,你的“字符串”是一个非空对象,在这种情况下翻译为true,而在第二个例子中,你正在询问这个String对象是否与Boolean对象相同,它们不同,所以翻译为false。

0
根据 ECMA 262 参考资料,如果您将 String 隐式转换为 Boolean,并且该 String 不为空字符串,则会计算为 true。
请查看此处

0

简单:

if("string") 被求值为布尔值。 任何不是 false 的值都是 true,无需转换为数字或其他任何形式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接