在js中,在每个对象中,都会继承两个方法:toString和valueOf
toString
顾名思义,toString就是将一个对象转化为字符串类型,默认的toString方法会输出以下结果:
| 类型 | 值 |
|---|---|
| 基本类型 | 返回基本类型字符串表示 |
| function | 返回定义的函数字符串 |
| 对象 | [object Object]等 |
js中对其内置对象大多都重新定义了toString方法
Date
new Date().toString()
'Fri Nov 19 2021 08:27:21 GMT+0800 (中国标准时间)'
Array
['a','b'].toString()
'a,b'
valueOf
valueOf的默认值是获取到这个对象的原始值,比如:
let obj = {a:1}
obj.valueOf()
//{a:1}
而js中对部分的内置对象又重新定义了valueOf方法
比如Date对象,就返回了1970.01.01到至今的毫秒数
toString Vs valueOf
js是一门弱类型语言,有一个很鲜明的特点在于,不同类型的数据可以互相进行比较运算。而在这个运算过程中,就是需要使用toString和valueOf对数据进行处理
处理规则
-
如果定义了valueOf,并且valueOf返回一个原始数据类型,大多数情况下优先调用valueOf
-
如果不定义valueOf(或者valueOf返回的不是原始数据类型),并且定义了toString(且toString返回一个原始数据类型),调用toString
-
如果将toString和valueOf方法都设置为null,或者都没有返回原始数据类型,报错
几种特殊情况
-
Date对象,默认先调用toString方法
-
String()和Number()的强制转化,String()方法会优先调用toString方法,Number会优先调用valueOf方法
Number中的经过valueOf转化得到的值不是number类型,会输出NaN
总结
1、数据转化的最终结果一定是原始数据类型,也就是valueOf和toString两者必须有一个最后的返回结果是原始数据类型,否则就会出现报错信息;
2、toString优先级比较高的对象(部分特例),先判断toString是否存在,然后toString是否返回原始数据类型,如果不是改为去判断valueOf
3、valueOf优先级高的对象(大部分情况),先从valueOf开始判断,然后再去判断toString;