任何人都可以解释为什么a = [] ? 1 : 2
a等于1,此处b = [] == true ? 1 : 2
b等于2
答案 0 :(得分:5)
Why does ('0' ? 'a' : 'b') behave different than ('0' == true ? 'a' : 'b')处理了一个非常类似的案例。
简而言之:
如果您有一个在布尔上下文中计算的值,则会将其传递给ToBoolean
以转换为布尔值。
如果您将值与==
进行比较,则会发生section 11.9.3 of the ECMAScript specification中的算法。在此算法中,两个操作数都转换为字符串或数字,并对这些值进行比较。
<强> a = [] ? 1 : 2
强>
通过调用ToBoolean(GetValue(lref))
将条件is converted设置为布尔值。现在我假设对于对象,GetValue
只返回对象本身和all objects evaluate to true
。
由于数组只是对象,因此该表达式的结果为1
。
<强> b = [] == true ? 1 : 2
强>
正如已经说过的,这里有很多类型转换。
首先,true
转换为数字:
7。如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
false
is converted to 0
and true
is converted to 1
所以我们有
[] == 1
然后第9步适用:
9。如果Type(x)是Object而Type(y)是String或Number,则 返回比较结果ToPrimitive(x)== y。
这意味着[]
被转换为原始值(字符串或数字)。如果您按照ToPrimitive
function(和section 8.12.8)进行操作,您会发现通过将数组与,
连接起来,数组将转换为字符串。由于空数组为无元素,因此结果为空字符串。
所以我们最终得到了
"" == 1
然后第5步适用:
5。如果Type(x)是String而Type(y)是Number,则返回比较结果ToNumber(x)== y。
An empty string is converted to 0
,因此0 == 1
false
,条件运算符返回2
。
答案 1 :(得分:1)
因为数组是一个对象,并且当一个对象在布尔比较的上下文中被计算时,它是“真实的”,但不完全正确。
答案 2 :(得分:1)
在第一个例子中,数组被转换为一个布尔值,它产生true,因为它不是null,undefined,“”,0或false。
在第二个示例中,由于equals运算符,您正在进行类型转换。来自mdn:
如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,则操作数将尽可能转换为数字。
在控制台中尝试以下操作:
Number(true) //gives 1
Number([]) //gives 0
因此,当转换为数字时,这些不相等。
答案 3 :(得分:0)
在a = [] ? 1 : 2
中,如果1
不是[]
或null
,则会返回undefined
。
在b = [] == true ? 1 : 2
中,如果1
为[]
,则会返回true
,但不是,因此返回2
。
答案 4 :(得分:0)
第一个是作业,因此必须落到真(但不等于任何东西)。将empty等于true将是错误的。
答案 5 :(得分:0)
因为使用[]
初始化数组会返回true而[] == true
不会: - )