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判断出类型.

  缺点:这个方法容易被改写

  

原文地址:https://www.cnblogs.com/web-chuan/p/11578008.html