当不同类型的数据进行相等比较(==)或四则运算时,会先将数据转换成相同类型的值在进行运算。
前情提要:
javascript数据类型有两种:
- 基本类型 string、number、boolean、undefined、null
- 引用类型 object、function、array、date
转换规则:
引用类型转换规则:
- 优先调用valueOf方法,如果对象不存在valueOf方法或者返回的数据不是基本类型,再调用对象的toString方法。
-
如果对象不存在toString方法或者方法返回的数据不是基本类型,系统抛出异常。
image.png
各类型转换结果对照表:
类型 | valueOf | toString |
---|---|---|
string | 本身 | 本身 |
number | 本身 | 本身的字符串形式 |
boolean | 本身 | 本身的字符串形式 |
undefiend | 本身 | 本身的字符串形式 |
null | 本身 | 本身的字符串形式 |
object | 本身 | '[object Object]' |
function | 本身 | 本身的字符串形式 |
array | 本身 | 本身的字符串形式,数组元素转成字符串格式并以,分隔,相当于array.join(',') |
date | 时间的时间戳,与getTime返回值相同 | 返回日期的文本表示 ("Wed Dec 27 2019 15:09:48 GMT+0800 (中国标准时间)") |
当进行相等( a == b)比较时
- 比较前,不能将 null 和 undefined 转换成其他任何值。null 和 undefined 相等
- NaN 不与任何数值相等,包括自身。
- 其他基本类型在比较时会先转换成number类型再进行比较
- 当a和b都是引用类型时,比较两个是否是相同对象
- 引用类型与基本类型比较时,会转换成基本类型再用以上规则进行比较。
四则运算
- 做加法(+)运算时,如果其中一个对象对string类型,则将另一个转换为string类型并拼接。
- 其他情况下,非number基本类型数据都会通过Number方法将起转化为number再参与运算。
- 当引用类型参与运算是,会运用上面的引用类型转换规则,得到基本类型数据,再运用上面的规则运算。
现在来看标题中的那个相等判断,解析结果产生的过程,等式左边以a代指,右边以b代指
- a为数组类型,所以先通过a.valueOf()得到结果a本身;
- 结果不是基本类型,再同过a.toString()方法得到结果'',结果为基本类型转换结束;
- b为boolean类型,根据boolean类型转换规则,可知b的结果为false;
- 所以表达式转换为 '' == false,再根据上面的相等转换规则可最后得出0 == 0;
- 所以结果为[] == ![]结果为true。