Introduction
JS中Object类型转换为Primitive类型的过程,称为ToPrimitive操作。这篇文章主要介绍一下这个过程。
转换流程
- 调用对象的
[Symbol.toPrimitive]
方法,如果返回的是Primitive类型,则返回。 - 否则,调用对象的
valueOf
方法,如果返回的是Primitive类型,则返回。 - 否则,调用对象的
toString
方法,如果返回的是Primitive类型,则返回。 - 否则,抛出TypeError异常。
[]
与{}
注意:[]
和{}
在转换为Primitive类型时,会有很大的不同。
- 转换为Number类型时,
[]
会转换为0
,{}
会转换为NaN
。 - 转换为String类型时,
[]
会转换为''
,{}
会转换为'[object Object]'
。 - 转换为Boolean类型时,
[]
会转换为false
,{}
会转换为true
。
之所以造成这么大的区别就是因为[]
和{}
的和toString()
方法的返回值不同。
[]
的toString()
方法返回的是''
,而valueOf()
方法返回的是[]
。{}
的toString()
方法返回的是'[object Object]'
,而valueOf()
方法返回的是{}
。
因为[]
能转换为空字符串
,而空字符串
可以转换为0
或false
,所以[]
能转换为0
或false
。而{}
则不能。