js 使用Object.prototype.toString方法判断各种数据类型

原型链概念:

js中的对象都继承自Object,在某个对象上调用一个方法时,会先在该对象上进行查找,如果没找到则会进入对象的原型(也就是.prototype)进行查找,如果没找到,同样的也会进入对象原型的原型进行查找,直到找到或者进入原型链的顶端Object.prototype才会停止。

数组的toString()方法和Object的toString()方法:

Object.toString === Array.toString    //true
Object.prototype.toString === Array.toString    //false
Object.prototype.toString === Array.prototype.toString  //false
Object.prototype.toString方法可以判断所有数据类型
Array.prototype.toString不能判断:
(Proxy Promise symbol() undefined null 不传值 自执行函数)
同时判断数组 [],new Array,new Array() 会变成 '' 
 Array.prototype.toString.call([]) // ''

Object.prototype.toString为什么要加.call():

let arr = [1,2,3,4,5]
Object.prototype.toString(arr)        // '[object Object]'
Object.prototype.toString.call(arr)   // '[object Array]'

因为.call的作用是重写this指针的指向
通过call指定arr数组为Object.prototype对象中的toString方法的上下文
this指向的是arr 类型是Array
如果不加.call()的话,this指向为Object,Object的数据类型自然是Object

使用Object.prototype.toString方法判断所有数据类型: 

Object.prototype.toString.call({}).slice(8,-1)
// 'Object'
Object.prototype.toString.call([]).slice(8,-1)
// 'Array'
Object.prototype.toString.call(()=>{}).slice(8,-1)
// 'Function'
Object.prototype.toString.call(function(){}).slice(8,-1)
// 'Function'
Object.prototype.toString.call('').slice(8,-1)
// 'String'
Object.prototype.toString.call(true).slice(8,-1)
// 'Boolean'
Object.prototype.toString.call(1).slice(8,-1)
// 'Number'
Object.prototype.toString.call(Infinity).slice(8,-1)
// 'Number'
Object.prototype.toString.call(NaN).slice(8,-1)
// 'Number'
Object.prototype.toString.call(undefined).slice(8,-1)
// 'Undefined'
Object.prototype.toString.call().slice(8,-1)
// 'Undefined'
Object.prototype.toString.call((function(){})()).slice(8,-1)
// 'Undefined'
Object.prototype.toString.call(null).slice(8,-1)
// 'Null'
Object.prototype.toString.call(new RegExp()).slice(8,-1)
// 'RegExp'
Object.prototype.toString.call(new RegExp).slice(8,-1)
// 'RegExp'
Object.prototype.toString.call(/a-Z/igm).slice(8,-1)
// 'RegExp'
Object.prototype.toString.call(symbol()).slice(8,-1)
// 'Symbol'
Object.prototype.toString.call(new Map()).slice(8,-1)
// 'Map'
Object.prototype.toString.call(new Set()).slice(8,-1)
// 'Set'
Object.prototype.toString.call(new Map).slice(8,-1)
// 'Map'
Object.prototype.toString.call(new Set).slice(8,-1)
// 'Set'
Object.prototype.toString.call(Math).slice(8,-1)
// 'Math'
Object.prototype.toString.call(new Date()).slice(8,-1)
// 'Date'
--**-- 以下皆是js 中的 构造函数
Object.prototype.toString.call(Function).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Object).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Array).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Number).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Boolean).slice(8,-1)
// 'Function'
Object.prototype.toString.call(String).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Date).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Promise).slice(8,-1)
// 'Function'
Object.prototype.toString.call(Proxy).slice(8,-1)
// 'Function'
Object.prototype.toString.call(RegExp).slice(8,-1)
// 'Function'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值