javascript比较运算符不一致

时间:2012-06-08 15:28:32

标签: javascript

任何人都可以解释为什么a = [] ? 1 : 2 a等于1,此处b = [] == true ? 1 : 2 b等于2

6 个答案:

答案 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不会: - )