所有的对象都继承了这两个方法,toString() 和 valueOf()
toString
顾名思义,toString()
就是将一个对象转化为字符串类型,默认的toString()
方法会输出以下结果:
类型 | 值 |
---|---|
原始数据类型 | 返回一个字符串 |
普通对象 | 返回 “[object Object]” |
数组 | 返回数组元素之间添加逗号合并成的字符串 |
函数 | 返回函数的定义式的字符串 |
日期对象 | 返回一个可读的日期和时间字符串 |
正则 | 返回其字面量表达式构成的字符串 |
let str = "string"
str.toString() ⇒ "string"
let obj = {a: 1}
obj.toString() ⇒ "[object Object]"
let arr = [1, 2];
arr.toString() ⇒ "1,2"
let fun = function(){}
fun.toString() ⇒ "function(){}"
let date = new Date;
date.toString() ⇒ "Mon Dec 02 2019 20:41:41 GMT+0800 (中国标准时间)"
let reg = /[0-9]/
reg.toString() ⇒ "/[0-9]/"
valueOf
类型 | 值 |
---|---|
日期对象 | 返回自1970年1月1日到现在的毫秒数 |
其他类型 | 均返回对象本身 |
str.valueOf() ⇒ "string"
obj.valueOf() ⇒ {a: 1}
arr.valueOf() ⇒ (2) [1, 2]
fun.valueOf() ⇒ ƒ (){}
date.valueOf() ⇒ 1575290501797
reg.valueOf() ⇒ /[0-9]/
我们知道,js是一门弱类型语言,有一个很鲜明的特点在于,不同类型的数据可以互相进行比较运算。而在这个运算过程中,就是需要使用toString
和valueOf
对数据进行处理。
调用规则
- 如果定义了
valueOf
,并且valueOf
返回一个原始数据类型,大多数情况下优先调用valueOf
let obj = {
a: 1
}
obj.toString = () => 10
obj.valueOf = () => 100
console.log(1 + obj); // 101
console.log('hello' + obj); // hello100
console.log(+obj); // 100
- 如果不定义
valueOf
(或者valueOf
返回的不是原始数据类型),并且定义了toString
(且toString
返回一个原始数据类型),调用toString
let obj = {
a: 1
}
obj.toString = () => 10
// obj.valueOf = () => 100
console.log(1 + obj); // 11
console.log('hello' + obj); // hello10
console.log(+obj); // 10
let obj = {
a: 1
}
obj.toString = () => 10
obj.valueOf = () => {
return {
a: 1
}
}
console.log(1 + obj); // 11
console.log('hello' + obj); // hello10
console.log(+obj); // 10
- 如果将
toString
和valueOf
方法都设置为null
,或者都没有返回原始数据类型,报错
let obj = {
a: 1
}
obj.toString = null
obj.valueOf = null
console.log(1 + obj);
console.log('hello' + obj);
console.log(+obj);
// Uncaught TypeError
特殊情况
Date
对象,默认先调用toString
方法String()
和Number()
的强制转化:
String()
方法会优先调用toString
方法,Number
会优先调用valueOf
方法
如果Number
中的经过valueOf
转化得到的值不是number
类型,会输出NaNalert
和join
使用alert
输出,会优先调用toString
方法
alert
就算没有重定义toString
方法,也会调用默认的toString
方法;
可以通过将obj
的toString
设为null
来调用valueOf
方法
而数组中如果存在引用数据类型,在调用数组的join
方法时,会先调用引用数据的toString
方法