Object.prototype.toString.call(obj) 为什么有用以及疑惑点
能检测的方法很多 基本上的疑惑点是如何检测object null array function,能准确的检测出来这几个的都是好方法
typeof 0; //number; typeof true; //boolean; typeof undefined; //undefined; typeof "hello world" //string; typeof function(){}; //function; typeof null; //object typeof {}; //object; typeof []; //object
1. typeof 为什么不准
因为当他在检测null array object的时候 都是object,这是因为这几个都是Object重写的实例 这个也会帮助我们理解标题的疑惑
2.Object.prototype.toString.call(obj) 为什么有用
toString方法返回反映这个对象的字符串
为什么它就能准确判断类型呢,为什么用Object.tostring 方法就不行呢
还是那一句话 null array object都是Object重写的实例 他们是有自己的tostring的方法 按照原型链的思路,会优先使用重写后的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. instanceof
可以检测是否是该原型的实例
// 判断 foo 是否是 Foo 类的实例 function Foo(){} var foo = new Foo(); console.log(foo instanceof Foo)//true
缺点:1.因为数组属于object中的一种,所以数组instanceof object,也是true.
var a={}; a instanceof Object //true a intanceof Array //false var b=[]; b instanceof Array //true b instanceof Object //true
缺点:2.instanceof不能区分基本类型string和boolean,除非是字符串对象和布尔对象
var c='abc'; c instanceof String; //false var d=new String(); d instanceof String //true
2.constructor
除了undefined和null,其他类型的变量均能使用constructor判断出类型.
缺点:这个方法容易被改写