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

IT技术 javascript
2021-01-22 02:58:38

鉴于以下代码:

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

6个回答

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

来自ECMAScript 语言规范

12.5if声明

语义

生产IfStatement : if ( Expression ) Statement else Statement评估如下:

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

9.2 ToBoolean

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

表 11 - ToBoolean 转换

未定义:false
空:false
布尔值:结果等于输入参数(无转换)。
Number:如果参数为+0-0NaN结果为否则结果为 字符串:如果参数为空字符串(其长度为零),则结果为否则结果为 对象:真实


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

有关详细信息,请参阅第 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 用于查找确切的情况。
2021-03-26 02:58:38
那么 toNumber 方法只适用于 == 吗?
2021-04-04 02:58:38

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


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

以下所有说法都是正确的:

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

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


当你写的时候if (something)if如果something是“真实的”就会执行

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

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

应该这样写。

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

我认为这是因为在第一个示例中,您的“字符串”是一个非空对象,在此上下文中转换为 true,而在第二个示例中,您询问此 String 对象是否与布尔值相同对象,它不是,所以它转换为 false。