js判斷數據類型的四種方法


1.typeof

  typeof是一個操作符,其右側跟一個一元表達式,並返回這個表達式的數據類型。返回的結果用該類型的字符串(全小寫字母)形式表示,包括number,string,boolean,undefined,object,function,symbol等。

typeof "";  //string
typeof 1;   //number
typeof false; //boolean
typeof undefined; //undefined
typeof function(){}; //function
typeof {}; //object
typeof Symbol(); //symbol
typeof null; //object
typeof []; //object
typeof new Date(); //object
typeof new RegExp(); //object

2.instanceof

  instanceof用來判斷A是否為B的實例,表達式為:A instanceof B,如果A是B的實例,則返回true,否則返回false。instanceof檢測的是原型,內部機制是通過判斷對象的原型鏈中是否有類型的原型。

{} instanceof Object; //true
[] instanceof Array;  //true
[] instanceof Object; //true
"123" instanceof String; //false
new String(123) instanceof String; //true

我們可以用下面的代碼實現instanceof。

function instance(left,right){ let prototype = right.prototype;  //獲取類型的原型
    let proto = left.__proto__;       //獲取對象的原型
    while(true){    //循環判斷對象的原型是否等於類型的原型,直到對象原型為null,因為原型鏈最終為null
       if (proto === null || proto === undefined){ return false; } if (proto === prototype){ return true; } proto = proto.__proto__; } } console.log(instance({},Object)); //true
console.log(instance([],Number)); //false

3.constructor

  當一個函數F被定義時,JS引擎會為F添加prototype原型,然后在prototype上添加一個constructor屬性,並讓其指向F的引用,F利用原型對象的constructor屬性引用了自身,當F作為構造函數創建對象時,原型上的constructor屬性被遺傳到了新創建的對象上,從原型鏈角度講,構造函數F就是新對象的類型。這樣做的意義是,讓對象誕生以后,就具有可追溯的數據類型。

4.Object.prototype.toString()

  toString()是Object的原型方法,調用該方法,默認返回當前對象的[[Class]]。這是一個內部屬性,其格式為[object Xxx],其中Xxx就是對象的類型。

  對於Object對象,直接調用toString()就能返回[object Object],而對於其他對象,則需要通過call、apply來調用才能返回正確的類型信息。

  

  封裝一個准確判斷數據類型的函數

function getType(obj){ let type = typeof obj; if(type != "object"){ return type; } return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); }

 


免責聲明!

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



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