为什么使用Object.prototype.toString.call(obj)检测对象类型?

你是否还在使用typeof检测类型?那就赶快学习使用Object.prototype.toString.call(obj)吧!

先看typeof

typeof 0;  //number;
typeof true;  //boolean;
typeof undefined;  //undefined;
typeof "hello world"   //string;
typeof function(){};   //function;

typeof null; //object
typeof {};  //object;
typeof []; //object

从上面的演示可以看出使用typeof检测null array object的时候,结果都是object,这是因为这几个都是Object重写的实例。

再看Object.prototype.toString.call(obj)

Object.prototype.toString.call("粽子师兄");//[object String]
Object.prototype.toString.call(12);//[object Number]
Object.prototype.toString.call(true);//[object Boolean]
Object.prototype.toString.call(undefined);//[object Undefined]
Object.prototype.toString.call(null);//[object Null]
Object.prototype.toString.call({name: "粽子师兄"});//[object Object]
Object.prototype.toString.call(function(){});//[object Function]
Object.prototype.toString.call([]);//[object Array]
Object.prototype.toString.call(new Date);//[object Date]
Object.prototype.toString.call(/\d/);//[object RegExp]

function Person(){};
Object.prototype.toString.call(new Person);//[object Object]

通过以上案例可以发现使用Object.prototype.toString.call(obj)进行检测对象类型是准确的。为什么呢?
因为toString方法返回反映这个对象的字符串

那为什么不直接用obj.toString()呢?

console.log("粽子师兄".toString());//粽子师兄
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 15 2021 17:08:24 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
console.log(undefined.toString());//error

同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

这是因为toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。

如果将数组的toString方法删除,会发生什么呢?

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"

通过实验可以看出,当我们删除了array自己的tostring方法后,再次访问会调用原型链后的方法 跟Object.prototype.tostring(obj)一样了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值