给出以下代码:
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语句有意义,但我不明白为什么第一个语句会导致内部循环被评估。这是怎么回事?
答案 0 :(得分:56)
它被强制转换为布尔值。任何非空字符串的计算结果为true。
来自ECMAScript Language Specification:
12.5
if
语句语义
生产 IfStatement :
if (
表达式)
声明else
声明< / em>评估如下:
- 让 exprRef 成为评估 Expression 的结果。
- 如果ToBoolean(GetValue( exprRef ))是 true ,那么
- 返回评估第一个 Statement 的结果。
- 否则,
醇>
- 返回评估第二个 Statement 的结果。
9.2 ToBoolean
抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:
表11 - ToBoolean Conversions
未定义: false
空:错误
Boolean:结果等于输入参数(无转换) 数字:如果参数为 +0 , -0 或 NaN ,则结果为 false ;否则结果是 true String:如果参数为空String(其长度为零),则结果为 false ; 否则结果是 true 对象: 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 :(得分:8)
非空字符串是真实的,但不一定等同于true
。
==
是一个“软”等式运算符
它使用类型强制来比较两个等价的对象。
以下所有情况均属实:
42 == "42"
0 == false
0 == ""
[] == ""
{} == "[object Object]"
"1" == true
Aribtrary字符串不等于任何原始值。 然而
当您撰写if (something)
时,如果if
是“真实的”,something
将会执行。
除以下内容外,所有值都是真实的:
false
0
NaN
""
null
undefined
答案 2 :(得分:1)
if ("string"===true)
应该这样写。
答案 3 :(得分:0)
“string”是一个非空的字符串。在JavaScript中,不为null的所有内容都评估为“true”。所以:if(“string”)与if(“string”!= null)相同但“string”不为true,它仍然是一个字符串值。
答案 4 :(得分:0)
我认为这种情况正在发生,因为在第一个示例中,您的“字符串”是一个非null对象,在此上下文中转换为true,而在第二个示例中,您询问此String对象是否相同作为布尔对象,它不是,因此它转换为false。
答案 5 :(得分:0)
if ("string") {
console.log('true!');
}
您可能已经知道,如果计算布尔表达式。所以检查
if((Boolean)"string")
因为(bool)字符串为true,所以它会通过。但是在
的情况下if ("string"==true) {
console.log('true!');
}
您正在尝试将字符串与bool等同,这显然会比较它们并返回false。
答案 6 :(得分:0)
从ECMA 262引用中,如果将String隐式转换为Boolean,并且String不是空String,则它将计算为true。
检查here
答案 7 :(得分:0)
简单:
if("string")
被评估为布尔值。任何非false
的值都是true
,不能转换为数字或任何类型的值。
将"string"
与布尔值true
进行比较显然会产生false
。
答案 8 :(得分:-8)
因为它的JavaScript就是这样。查看本页右侧的所有相关问题。