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

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM