作者:李白不吃茶v
https://juejin.im/post/6873215243804213262
基本上,所有JS数据类型都拥有这两个方法,null除外。它们俩是位于原型链上的方法,也是为了解决javascript值运算与显示的问题。
valueOf
和 toString
几乎都是在出现操作符(+-*/==>时被调用(隐式转换)。
toString
返回一个表示该对象的字符串,当对象表示为文本值或以期望的字符串方式被引用时,toString方法被自动调用。
1. 手动调用看看什么效果
嗯,跟介绍的一样,没骗人,全部都转成了字符串。
比较特殊的地方就是,表示对象的时候,变成[object Object]
,表示数组的时候,就变成数组内容以逗号连接的字符串,相当于Array.join(',')
。
let a = {}
let b = [1, 2, 3]
let c = '123'
let d = function(){ console.log('fn') }
console.log(a.toString()) // '[object Object]'
console.log(b.toString()) // '1,2,3'
console.log(c.toString()) // '123'
console.log(d.toString()) // 'function(){ console.log('fn') }'
2. 最精准的类型判断
这种属于更精确的判断方式,在某种场合会比使用 typeof
& instanceof
来的更高效和准确些。
toString.call(()=>{}) // [object Function]
toString.call({}) // [object Object]
toString.call([]) // [object Array]
toString.call('') // [object String]
toString.call(22) // [object Number]
toString.call(undefined) // [object undefined]
toString.call(null) // [object null]
toString.call(new Date) // [object Date]
toString.call(Math) // [object Math]
toString.call(window) // [object Window]
3. 什么时候会自动调用呢
使用操作符的时候,如果其中一边为对象,则会先调用toSting
方法,也就是隐式转换
,然后再进行操作。
let c = [1, 2, 3]
let d = {
a:2}
Object.prototype.toString = function(){
console.log('Object')
}
Array.prototype.toString = function(){
console.log('Array')
return this.join(',') // 返回toString的默认值(下面测试)
}
Number.prototype.toString = function(){
console.log('Number')
}
String.prototype.toString = function(){
console.log('String')
}
console.log(2 + 1) // 3
console.log('s') // 's'
console.log('s'+2) // 's2'
console.log(c 2) // false (一次 => 'Array')
console.log(c + c) // "