JS运算规则问题-上

JS运算规则问题(上)


问题:请回答下图中最后输出结果为什么是false和1?

Question

一、为什么[] == true输出结果为false?

要想知道为什么输出false,那得先知道==是怎么进行比较的。
the equals operator
上图是JavaScript的==操作符的实现标准,意思是在比较的时候,会把左右两边的表达式使用GetValue()进行转换,然后再用两者得到的值进行比较,即图上的第5项

然后跟踪来到11.9.3章节,内容如下

The Abstract Equality

由于操作符右边的表达式为Boolean类型,所以满足上图中的第7项条件,需要先用ToNumber()方法来把布尔类型表达式转换为数字,我们都知道true转换为数字类型时,值为1

然后左边的表达式是数组,类型为Object,因此满足第9项条件,于是再用ToPrimitive()方法转换左边的表达式。

接下来看看ToPrimitive()
ToPrimitive
因为需要转换的表达式为Object类型,所以采用最后一条规则。转换的结果是通过[[DefaultValue]]获取的Object的默认值。

再来看看[[DefaultValue]]的说明
DefaultValue
由于对象Object内部的[[DefalutValue]]hintString,所以用toString返回值,而数组[]使用toString方法,返回值为""
toString

所以,一开始的[] == true的比较就相当于是"" == 1的比较,然后再回到一开始的 == 实现标准,即The Abstact Equality Comparison Algoritem章节的内容

这个时候满足条件第5项
The Abstract Equality

需要把字符串""转换为数字,由于是空字符串,所以转换后的值为0

最终的结果就相当于是0 == 1,我们当然知道这两者不相等,所以返回值为false

不知道各位看官看明白了吗?好了,就讲到这里,第二个请看下面这篇文章

https://zhongzilu.github.io/2017/02/05/js运算规则问题下/

Thanks for watching!

作者钟子路(zhongzilu)
原文地址: https://zhongzilu.github.io/JS运算规则问题(上)/

本文总阅读量