JS运算规则问题(上)
问题:请回答下图中最后输出结果为什么是false和1?
一、为什么[] == true输出结果为false?
要想知道为什么输出false,那得先知道==
是怎么进行比较的。
上图是JavaScript的==
操作符的实现标准,意思是在比较的时候,会把左右两边的表达式使用GetValue()
进行转换,然后再用两者得到的值进行比较,即图上的第5项
。
然后跟踪来到11.9.3章节,内容如下
由于操作符右边的表达式为Boolean
类型,所以满足上图中的第7项
条件,需要先用ToNumber()
方法来把布尔类型表达式转换为数字,我们都知道true
转换为数字类型时,值为1
。
然后左边的表达式是数组,类型为Object
,因此满足第9项条件
,于是再用ToPrimitive()
方法转换左边的表达式。
接下来看看ToPrimitive()
因为需要转换的表达式为Object
类型,所以采用最后一条规则。转换的结果是通过[[DefaultValue]]
获取的Object
的默认值。
再来看看[[DefaultValue]]
的说明
由于对象Object
内部的[[DefalutValue]]
的hint
为String
,所以用toString
返回值,而数组[]
使用toString
方法,返回值为""
所以,一开始的[] == true
的比较就相当于是"" == 1
的比较,然后再回到一开始的 == 实现标准,即The Abstact Equality Comparison Algoritem章节的内容
这个时候满足条件第5项
需要把字符串""
转换为数字,由于是空字符串,所以转换后的值为0
最终的结果就相当于是0 == 1
,我们当然知道这两者不相等,所以返回值为false
不知道各位看官看明白了吗?好了,就讲到这里,第二个请看下面这篇文章
Thanks for watching!
作者:钟子路(zhongzilu)
原文地址: https://zhongzilu.github.io/JS运算规则问题(上)/