全面分析toString与valueOf,并随手解决掉几道大厂必备面试题


全面分析toString与valueOf,并随手解决掉几道大厂必备面试题

文章插图
文章插图
最近深圳的天气是变化多端的 , 时而倾盆大雨 , 时而艳阳高照 , 多希望能有个几天是连绵不绝地下雨 , 那该多好啊~~
让人恐惧的夏天也许就过去了 , 没人知道你在这个夏天、这个今年发生什么 , 但是我知道 。
知道你是努力的 , 也有可能是缓慢的 。不过面对秋天 , 面对即将到来的国庆小假期 , 还请继续努力吧 , 川流不息的不止生命 , 还有时间 , 加油~~
今天 , 我是作者 , 也是读者 , 为自己交作业 , 也为技术学习的路上交作业~~
好了 , 进入正题 , 先理解这两个方法是做什么的:
基本上 , 所有JS数据类型都拥有这两个方法 , null除外 。它们俩是位于原型链上的方法 , 也是为了解决javascript值运算与显示的问题 。
valueOftoString 几乎都是在出现操作符(+-*/==><)时被调用(隐式转换) 。
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)// 3console.log('s')// 's'console.log('s'+2)// 's2'console.log(c < 2)// false(一次 => 'Array')console.log(c + c)// "1,2,31,2,3" (两次 => 'Array')console.log(d > d)// false(两次 => 'Object')复制代码4. 重写toString方法既然知道了有 toString 这个默认方法 , 那我们也可以来重写这个方法
class A {constructor(count) {this.count = count}toString() {return '我有这么多钱:' + this.count}}let a = new A(100)console.log(a)// A {count: 100}console.log(a.toString())// 我有这么多钱:100console.log(a + 1)// 我有这么多钱:1001复制代码

经验总结扩展阅读