檢測數據類型的四種方法


檢測數據類型的方式

typeof

返回結果是一個字符串,typeof不能檢測null,和數組,都是返回的object
typeof可以檢測基本數據類型和引用數據類型
缺點: 不能檢測null 和 Array,返回的都是Object

typeof 1
"number"
typeof "1"
"string"
typeof false
"boolean"
typeof null
"object"
typeof undefined
"undefined"
typeof {}
"object"
typeof []
"object"
typeof /\d/
"object"
typeof Symbol(1)
"symbol"
typeof 2n
"bigint"
typeof function(){}
"function"

instanceof

instanceof 不能用於判斷基本數據類型,只能用於判斷引用數據類型,判斷其是否屬於某個類的實例對象
instanceof 的內部機制是通過判斷對象的原型鏈中是不是能找到類型的 prototype。

function Car(make, model, year) {
          this.make = make;
          this.model = model;
          this.year = year;
        }
        const auto = new Car('Honda', 'Accord', 1998);


        console.log(typeof Car);//typeof可以檢測function類型,但是不能檢測Array和null
        console.log(auto instanceof Car);//true

        console.log(auto instanceof Object);//true

        console.log([1,2] instanceof Array);//true
        console.log([] instanceof Array);//true
        console.log([] instanceof Object);//true
        console.log({} instanceof Object);//true
        console.log({name:'123'} instanceof Object);//true
        console.log(Function instanceof Object);//true
        console.log(function(){} instanceof Object);//true
        /* *************************** */
        /* 特殊的情況 */
        console.log("1" instanceof String); //false?
        console.log(1 instanceof Number); //false?      👉注意: instanceof 不能用於判斷基本數據類型,只能用於判斷引用數據類型,判斷其是否屬於某個類的實例對象
        console.log(true instanceof Boolean); //false?
        //
        console.log(new String("1") instanceof String);//true
        console.log(new Number(1) instanceof Number);//true
        console.log(new Boolean(true) instanceof Boolean);//true

constructor

注意: constructor不能用於undefined和null的檢測,因為他們沒有構造函數

        console.log("".constructor===String);//true
        console.log("1".constructor===String);//true
        console.log([].constructor===Array);//true
        console.log([].constructor===Object);//false? 👉這就是constructor的缺陷,檢測不一定准確
        console.log({}.constructor===Object);//true
        console.log(/\d/.constructor===RegExp);//true
        console.log(/\d/.constructor===Object);//false? 👉 這就是constructor的缺陷,檢測不一定准確
//注意: constructor不能用於undefined和null的檢測,因為他們沒有構造函數
        console.log("".constructor===String);//true
        console.log("1".constructor===String);//true
        console.log([].constructor===Array);//true
        console.log([].constructor===Object);//false? 👉這就是constructor的缺陷,檢測不一定准確
        console.log({}.constructor===Object);//true
        console.log(/\d/.constructor===RegExp);//true
        console.log(/\d/.constructor===Object);//false? 👉 這就是constructor的缺陷,檢測不一定准確

Object.prototype.toString.call()

每一個繼承 Object 的對象都有 toString 方法,如果 toString 方法沒有重寫的話,會返回 [Object type],其中 type 為對象的類型。但當除了 Object 類型的對象外,其他類型直接使用 toString 方法時,會直接返回都是內容的字符串,所以我們需要使用call或者apply方法來改變toString方法的執行上下文
優點:這種方法對於所有基本的數據類型都能進行判斷,即使是 null和defined也能進行檢測.

Object.prototype.toString.call(‘An’) // “[object String]”
Object.prototype.toString.call(1) // “[object Number]”
Object.prototype.toString.call(Symbol(1)) // “[object Symbol]”
Object.prototype.toString.call(null) // “[object Null]”
Object.prototype.toString.call(undefined) // “[object Undefined]”
Object.prototype.toString.call(function(){}) // “[object Function]”
Object.prototype.toString.call({name: ‘An’}) // “[object Object]”


免責聲明!

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



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