为什么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
语句语义
生成IfStatement :
if (
Expression)
Statementelse
语句的计算方法如下:
- 让exprRef是评估expression式的结果。
- 如果ToBoolean(GetValue( exprRef ))为true ,那么
- 返回评估第一个语句的结果。
- 其他,
- 返回评估第二条语句的结果。
9.2 ToBoolean
抽象操作ToBoolean根据表11将其参数转换为Booleantypes的值:
表11 – 至宝转换
未定义: false
空: 假
布尔值:结果等于input参数(不转换)。
Number:如果参数为+0 , -0或NaN ,则结果为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
。
从ECMA 262引用中,如果将String隐式转换为Boolean,并且String不是空string,则它将计算为true。
在这里检查
因为它的JavaScript就是这样。 查看本页右侧的所有相关问题。