Object.prototype.toString.call()和Array.prototype.slice.call()的原理

最近发现了个判断js数据类型的“终极武器”,Object.prototype.toString.call()。首先来看效果。

//1.判断基本类型:
 Object.prototype.toString.call(null);//”[object Null]”
 Object.prototype.toString.call(undefined);//”[object Undefined]”
 Object.prototype.toString.call(“abc”);//”[object String]”
 Object.prototype.toString.call(123);//”[object Number]”
 Object.prototype.toString.call(true);//”[object Boolean]”
 
//2.判断原生引用类型:
 //函数类型
  Function fn(){console.log(“test”);}
  Object.prototype.toString.call(fn);//”[object Function]”
 //日期类型
  var date = new Date();
  Object.prototype.toString.call(date);//”[object Date]”
// 数组类型
  var arr = [1,2,3];
  Object.prototype.toString.call(arr);//”[object Array]”
 //正则表达式
  var reg = /[h]at/g;
  Object.prototype.toString.call(reg);//”[object RegExp]”

 是不是,js里面的基本数据类型和引用数据类型都已经判断完毕。按理说,Array和Function都有toString()方法,为什么要调用Object原型上的呢,因为他们的toString被改写了。例子如下:


var arr = [1, 2, 3]
arr.toString()  // '1,2,3'

var obj = {lang:'zh'}
obj.toString()  // '[object Object]'

var fn = function(){}
fn.toString()  // 'function(){}'

null.toString()  // Cannot read property 'toString' of null

undefined.toString() // Cannot read property 'toString' of undefined

由此可见,虽然这些数组,函数,null...继承了Object里面的属性,但是为了更加简便的开发都做了一些重写。所以要想判断数据类型,就只能用Object.prototype.toString.call(),下面来编写一个完整的判断事件类型的函数。也就比较简单了。

function test(value){
    return Object.prototype.toString.call(value).replace('[object ','').replace(']','')
}

接下来说一说,Object.prototype.slice.call()。能将类数组,以及带有length的可遍历的对象转化为数组。上代码.

function test(a,b,c,d) 
   { 
      var arg = Array.prototype.slice.call(arguments,1); 
      console.log(arg); 
   } 
   test("a","b","c","d");//[ 'b', 'c', 'd' ]

首先将arguments转化为数组,再让他有slice方法。当然ES6里面的Array.from已经实现了这种操作。以上仅供大家参考,有不正确的欢迎批评指正,一起进步!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值