ToString
1、数组中的null
或undefined
,会被当做空字符串处理
2、普通对象:转为字符串相当于直接使用Object.prototype.toString()
,返回"[object Object]"
ToNumber
1、null: 转为0
2、
数组/对象:数组首先会被转为原始类型,然后在根据转换后的原始类型按照对应规则处理
ToBoolean
1、js中的假值只有false
、null
、undefined
、空字符
、0
和NaN
,其它值转为布尔型都为true
ToPrimitive
指对象类型类型(如:对象、数组)转换为原始类型的操作
- 当对象类型需要被转为原始类型时,它会先查找对象的
valueOf
方法,如果valueOf
方法返回原始类型的值,则ToPrimitive
的结果就是这个值 - 如果
valueOf
不存在或者valueOf
方法返回的不是原始类型的值,就会尝试调用对象的toString
方法,也就是会遵循对象的ToString
规则,然后使用toString
的返回值作为ToPrimitive
的结果。 - 如果
valueOf
和toString
都没有返回原始类型的值,则会抛出异常
布尔类型和其他类型的相等比较
只要布尔类型
参与比较,该布尔类型
的值首先会被转换为数字类型
根据布尔类型
的ToNumber
规则,true
转为1
,false
转为0
null、undefined和其他类型的比较
ECMAScript规范
中规定null
和undefined
之间互相相等(==)
,并且也与其自身相等,但和其他所有的值都不相等(==)
总结1:+号操作的隐士转换规则
1、如果某个操作数是字符串或者能够转换为字符串的话, + 将进行拼接操作。可见在 + 操作中字符串的拼接「优先级」高于数字的 +。
2、数组或者对象在调用valueOf()
方法如果无法获取到基本类型值(数字),会转而调用toString()
总结2:==号操作的隐士转换规则
- 字符串和数字之间的相等比较:
- 如果Type(x)是数字,Type(y)是字符串,则返回
x == ToNumber(y)
的结果。 - 如果Type(x)是字符串,Type(y)是数字,则返回
ToNumber(x) == y
的结果。
- 其他类型值和布尔类型之间的相等比较:
- 如果Type(x)是布尔类型,这返回
ToNumber(x) == y
的结果 - 如果Type(y)是布尔类型,则返回
x == ToNumber(y)
的结果
- null和undefined之间的相等比较
- 如果x为null,y为undefined,则结果为true
- 如果x为undefined,y为null,则结果为true
- 对象和非对象之间的相等比较:
- 如果Type(x)是字符串或者数字,Type(y)是对象,则返回
x == ToPrimitive(y)
的结果 - 如果Type(x)是对象,Type(y)是字符串或者数字,则返回
toPrimitive(x) == y
的结果
== 相等操作中,如果两边的操作数不同的话,都会进行类型转换,而且优先转为数字,再进行比较,如果转换后还不同则再次转换,直到相同为止