判断数据类型的方法是Object.prototype.toString.call, 为什么要通过call来调用?

        我们都知道判断数据类型,通过Object.prototype.toString.call()来判断。今天面试官这样问我,那为什么要用call呢?一开始我没有理解这个问题,我说call改变this,让数据可以使用这个方法。可能没有答到面试官想要知道的点上面去。事后我下去重新查了资料,又有新的理解。

看了这篇文章后,让我有了新的理解,原文链接:Object.prototype.toString.call()的原理_韩振方的博客-CSDN博客

      我们知道,不同的数据类型都有toString方法,通常是将数据转换为字符串类型,如

数字类型:

const num = 111;
console.log(num.toString()) // 输出字符串的 '111'
console.log(typeof num.toString()) // string

       num.toString() 方法等同于  Number.prototype.toString.call(num),本质是调用自己Number构造函数中的原型方法。

函数:

function foo () {
  return 1
}
console.log(foo.toString())  
/*
输出字符串的函数本身
'function foo () {
  return 1
}'
*/
console.log(typeof foo.toString())  // string

       foo.toString() 方法等同于  Function.prototype.toString.call(foo),本质是调用自己Function构造函数中的原型方法。

对象呢?

const obj = {a:1}
console.log(obj.toString())

        啊?为什么不是输出字符的 {a:1},而是输出 [object Object]  ?,toString 方法不是用来将数据转换为字符串吗?同上,obj.toString() 方法等同于  Object.prototype.toString.call(obj),本质是调用自己Object构造函数中的原型方法。

       而Object.prototype.toString方法的输出本来就是 [object XXXX],其中XXXX就是调用该方法的数据类型,即obj的数据类型是Object,故toString方法输出显示 [object Object]。

       为什么前面数字类型、函数类型,调用toString方法是返回自己的字符串形式呢?那是因为js本身将这些toString方法改写了,让其输出字符串形式的自己。下面来验证一下,删除自己的构造函数上的toString方法,让其根据原型链调用Object上的toString方法。

同样使用上面的数字类型:

const num = 111;
delete Number.prototype.toString
console.log(num.toString()) // [object Number]

       咦?真的变了,变成 [object Number],这也验证了上面说的Number改写了toString方法。

同样的函数类型

function foo () {
  return 1
}
delete Function.prototype.toString
console.log(foo.toString())   // [object Function]

       这样各种类型,都可以通过toString来展示当前数据的类型了。

       那我们不能为了判断类型,就把所有对应数据的toString方法都删掉吧?

       那就用到call方法,把该数据通过Object.prototype.toString来调用,而不是调用自己的数据构造函数中的原型toString方法。

console.log(Object.prototype.toString.call(num)) // [object Number]

       这也是为什么需要用call调用了,因为每个数据的原始toString方法被改写,通过call,让该数据调用Object上的toString方法,用以判断当前数据的类型。

       我想,这应该才是是面试官想要的答案吧。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值