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 爲何不許spa

  由於當他在檢測null array object的時候  都是object,這是由於這幾個都是Object重寫的實例  這個也會幫助咱們理解標題的疑惑prototype

2.Object.prototype.toString.call(obj) 爲何有用code

  toString方法返回反映這個對象的字符串對象

  爲何它就能準確判斷類型呢,爲何用Object.tostring 方法就不行呢blog

  仍是那一句話 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)同樣了原型

 

擴展:其餘能檢測類型的方法string

  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判斷出類型.

  缺點:這個方法容易被改寫

相關文章
相關標籤/搜索