在上一篇的js数据类型转换(1)中,只考虑了基础数据类型之间的相互转换,未考虑对象和基础类型的转换,本篇做介绍。
基础类型转对象
基础类型可以通过对应的构造函数转换为对应的对象类型,不做赘述。
对象转基础类型规则
1. 对象转布尔
所有对象转换为布尔值时,结果都为true。
2. 对象转字符串
对象转换为字符串时,会先调用对象的toString()方法,如果该方法返回原始值,则返回该原始值的字符串值;如果没有toString()方法或者该方法返回的不是原始值,则会调用valueOf()方法,如果该方法返回原始值类型,则返回该原始值的字符串值;如果没有valueOf()方法或者该方法返回的不是原始值,则抛出类型异常的错误。
3. 对象转数值
对象转换数值时,逻辑与对象转字符串相似,只是会先尝试调用valueOf()方法,再尝试调用toString()方法。
上述规则中,如果对象有Symbol.toPrimitive属性的话,会优先调用,它的优先级最高。
隐式类型转换中对象转基础类型的规则
1. +
如果一个是对象,另一个是数字或字符串,则将对象转为原始值再计算(日期类型转为字符串,其他的先尝试调用valueOf()方法再尝试调用toString()方法转换为原始值);如果都是对象,则先尝试调用valueOf()方法再尝试调用toString()方法转换为原始值再计算。
2. -(一元运算符)
转换为数字再计算。
3. >,<,>=,<=,==
比较运算符两边都会转换为数字或者字符串进行比较。两边的任一对象都会先尝试调用valueOf()方法转换为原始值,再尝试调用toString()方法转换为原始值,如果原始值都是字符串类型,则进行字符串的比较;如果有一个为数字类型,则另一个也转换为数字,进行比较。
4. -,*,/,%
转换为数字进行计算。