ToPrimitive 方法,是js中每个值隐含的自带方法,用来将值转换为基本类型。如果值为基本类型,则返回本身,否则,进行转换,返回基本类型值。
/**
* @obj 需要转换的对象
* @type 期望的结果类型 Number或String
*/
ToPrimitive(obj,type)
1、当type为Number时
调用obj的valueOf方法,如果为原始值,则返回,否则,进行下一步;
调用obj的toString方法,后续同上;
抛出TypeError异常。
2、当type为String时
调用obj的toString方法,如果为原始值,则返回,否则,进行下一步;
调用obj的valueOf方法,后续同上;
抛出TypeError异常。
默认情况下,如果对象为Date对象,则type默认为string;其他情况下,type默认为number。
综上所述,基本规则可以概括为以下函数:
var objToNumber = value => Number(value.valueOf().toString())
objToNumber([]) === 0
objToNumber({}) === NaN
js的隐式类型转换主要发生在+、-、*、/ 以及==、>,<这些运算符之间。
1、+操作符
操作符的两边至少一个string类型变量时,两边的变量都会被隐式转换为字符串;其他情况下两边变量都会变为数字。
2、-、*、/ 操作符
NaN也是一个数字
都转换为数字类型
3、==操作符
操作符两边的值都尽量转为number类型
4、<、>操作符
如果两边都是字符串,则比较字母表顺序;
其他情况下,转换为数字再比较。
5、对象类型会先通过ToPrimitive方法转换为基本数据类型,再进行操作
var a = {name:'Jack'}
var b = {age: 18}
a + b // "[object Object][object Object]"a.valueOf() // {},上面提到过,ToPrimitive默认type为number,所以先valueOf,结果还是个对象,下一步
a.toString() // "[object Object]"
b.valueOf() // 同理
b.toString() // "[object Object]"
a + b // "[object Object][object Object]"