1.valueOf() 和toString() 在各种数据类型下的表现
undefined.toString() //Cannot read property 'toString' of undefined
undefined.valueOf() //Cannot read property 'valueOf' of undefined
null.toString() //Cannot read property 'toString' of null
null.valueOf() //Cannot read property 'valueOf' of null
true.toString() //"true"
(true).valueOf() //true
(1).toString() //"1"
(1).valueOf() //1
"nan".toString(); //"nan"
"nan".valueOf(); //"nan"
(['1', 1, 'a']).valueOf() //["1", 1, "a"]
(['1', 1, 'a']).toString() //"1,1,a" ---调用 Array.prototype.join(',')
({a: 1}).valueOf() //{a: 1}
({a: 1}).toString() //"[object Object]"
(new Set([1])).valueOf() //Set(1) {1}
(new Set([1])).toString() //"[object Set]"
(new Map([["a", 1]])).valueOf() //Map(1) {"a" => 1}
(new Map([["a", 1]])).toString() //"[object Map]"
(()=>{}).valueOf() //()=>{}
(()=>{}).toString() //"()=>{}"
(function () {}).valueOf() //ƒ () {}
(function () {}).toString() //"function () {}"
(new Date()).valueOf() //1583898813642
(new Date()).toString() //"Wed Mar 11 2020 11:53:41 GMT+0800 (中国标准时间)"
(new RegExp()).valueOf() // /(?:)/
(new RegExp()).toString() // "/(?:)/"
(Symbol("symbol")).valueOf() //Symbol(symbol)
(Symbol("symbol")).toString() //"Symbol(symbol)"
- undefined和null没有这两种方法。
- Date 类型的valueOf() 返回标准时间戳,其他类型均返回数据本身。
- 各种类型数据的toString() 方法均返回字符串,其中 Array 调用 Array.prototype.join(','),Object,Set,Map 返回 "[object xxx]"。
2.调用顺序
class Person {
constructor(name) {
this.name = name;
}
valueOf() {
console.log('--- valueOf ---');
return false;
}
toString() {
console.log('=== toString ===');
return this.name;
}
}
const p = new Person('Nan');
//字符串拼接
console.log(p + " OK");
// --- valueOf ---
// false OK
当valueOf() 的返回值是Boolean 时,并没有执行toString() 方法。
下面把valueOf() 的返回值变一变。
return null;
// --- valueOf ---
// null OK
return this.name;
// --- valueOf ---
// Nan OK
return this;
// --- valueOf ---
// === toString ===
// Nan OK
return new Array(1, 2);
// --- valueOf ---
// === toString ===
// Nan OK
return Symbol()
// --- valueOf ---
// Cannot convert a Symbol value to a string
结论:优先调用valueOf(), 若返回值不是以下数据类型中的一种,则调用toString()。
- null
- undefined
- Boolean
- Number
- String
- Symbol
若为 Symbol() 则会报错。等价于 Symbol() + " OK"。
另外调用到toString()时,其返回值也要是基本数据类型,否则会报错。