[] ==![]计算结果为true

Tek*_*Tek 14 javascript arrays compare

我想知道为什么标题中给出的表达式

[] == ![]

被评估为true.

您无法将数组作为字符串进行比较.我明白了.如果

[] == []

将评估为false,因为引用不同.虽然我们有以下声明.

var arr = []; 
arr == arr // this evaluates to true simply because references are the same.
Run Code Online (Sandbox Code Playgroud)

按顺序A == B返回trueA和B必须是falsetrue.A ==!B为了返回true A可以true和B可以false相反,但在这种情况下,A和B是相同的值,所以我不明白.

Aka*_*ija 17

基本上,如果两种类型不相同,Javascript会尝试将两边都转换为数字.如果它是一个Object,它会尝试转换为原始值

所以在这种情况下将逐步进行

=> []==![]

=> []==false // Type conversion by the statement itself

=> []==0 // To number of right operand

=> ""==0 // To Primitive call for Array which will in this case convert to empty string

=> 0==0 // To number call of "" which is 0

=> true
Run Code Online (Sandbox Code Playgroud)

可以在编译器描述中检查ecmascript解释http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

  • 一个很好的解释,谢谢!但是,如果使用“==”运算符*Javascript尝试将两边都转换为数字(如果两种类型不相同)*,那么为什么“null == undefined”被评估为“true”?在这个逻辑下: 1) `+null` 就是 `0`;2) `+undefined` 是 `NaN`;3) `0 == NaN` 被评估为 `false`。并且“Number(undefined) == Number(null)”也是“false”。 (3认同)

Dan*_*ite 10

![]评估为,false因为引用是真实的。[]可以转换为错误的数字(在这种情况下为 0)。因此:条件相等地通过。如果你这样做了,===那就是假的。

  • _“因为引用是真实的”_ — 引用不真实或不真实,_值_ 是真实的。_“因此:条件作为相等传递”_ — 它不会作为相等传递,因为使用抽象比较将虚假值与“false”进行比较(或者“NaN == false”、“null == false”等。将是“true”);您缺少“false”的类型强制。一步一步,`[]`被强制为`""`,然后为`0`,然后`false`被强制为`0`,然后严格相等比较为`0 === 0`,结果‘真实’。 (2认同)

Bar*_*ing 6

每当使用==比较2个值时,javascript就会执行抽象平等比较算法。

在此处输入图片说明

此处,x为[],y为![]。也,

typeof([]) // "object"
typeof(![]) // "boolean"
Run Code Online (Sandbox Code Playgroud)

由于y是布尔值,而x是对象,因此条件7是第一个条件:

如果Type(y)为Boolean,则返回比较结果x == ToNumber(y)。

ToNumber(y)的值是多少?

Number(![]) // 0
Run Code Online (Sandbox Code Playgroud)

因为[]是真实值,所以取反将其设为假。Number(false)为0

现在我们进行比较:[] == 0。

由于typeof(0)是“数字”,因此条件8现在成立:

如果Type(x)是Object并且Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。

ToPrimitve(x)类似于x.toString()。

[].toString() // ”” - the empty string
Run Code Online (Sandbox Code Playgroud)

现在我们几乎要面对比较:“” == 0

现在,条件5成立:

如果Type(x)为String,Type(y)为Number,则返回比较结果ToNumber(x)== y。

ToNumber(“”) // 0
Run Code Online (Sandbox Code Playgroud)

最后,两个操作数具有相同的类型和条件1成立。我想你可以从这里带走)

阅读有关规格的抽象平等比较