1. 程式人生 > 程式設計 >JavaScript中檢測資料型別的四種方法

JavaScript中檢測資料型別的四種方法

目錄
  • 1. typeof
  • 2. instanceof
  • 3. constructor(建構函式)
  • 4. Object.prototype.toString.call()

前言:
在介紹檢測資料型別的方法之前,先說說中資料型別有哪些吧~

資料型別主要分為兩大類:基本資料型別和引用資料型別

基本資料型別:number、string、boolean、null、undefined、symbol(es6)
引用資料型別:object(array、function、date...)

資料型別詳細介紹請點選這裡

檢測資料型別四種方法:

  • typeof
  • instanceof
  • constructor
  • Object.prototype.toString.call()

1. typeof

語法:

typeof(變數)
//or
typeof 變數

示例:

console.log(typeof "");      //string
console.log(typeof 1);       //number
console.log(typeof true);     //boolean
console.log(typeof null);     //object!!!
console.log(typeof undefined);   //undefined
console.log(typeof []);      //object
console.log(typeof function(){}); //function
console.log(typeof console.log);  //function
console.log(typeof {});      //object
console.log(typeof Symbol());   //symbol(es6)
console.log(typeof 23423n);    //bigint(谷歌67版本新提出)

總結:

  • typeof 的返回型別為字串,值有:numberbooleanstringobjectfunctionundefinedsymbolbigint
  • typeof 一般用來判斷基本資料型別,除了判斷null會輸出"object",其它都是正確的
  • typeof 判斷引用資料型別時,除了判斷函式會輸出"function",其它都是輸出"object"

注意:這裡涉及兩個經常考的面試題!

  • null 的資料型別是object (null是一個空的引用物件,是一個佔位符)
  • console.log 的資料型別是function
  • 對於引用資料型別的判斷,使用typeof並不準確,所以可以使用instanceof來判斷引用資料型別

2. instanceof

instanceof 可以準確的判斷引用資料型別,它的原理是檢測建構函式的prototype屬性是否在某個例項物件的原型鏈上

語法:

obj1 instanceof obj2 //obj1 是否是 obj2的例項

示例:

console.log(9 instanceof Number);          // false
console.log(true instanceof Boolean);        // false
console.log('libo' instanceof String);        // false 
console.log([] instanceofAvdZANPRL Array);          // true
console.log(function(){} instanceof Function);    // true
console.log({} instanceof Object);          // true
// 注意以下兩組
console.log(typeof null);              //object
console.log(null instanceof Object);         //false !!!
console.log(typeof NaN);        www.cppcns.com       //number
console.log(NaN instanceof Number);         //false !!!

總結:

  • instanceof 用來判斷物件,程式碼形式為 【obj1 instanceof obj2】(obj2 必須為物件,否則會報錯!)
  • instanceof 返回值為布林值

注意:

instanceof只能用來判斷兩個物件是否屬於例項關係, 而不能判斷一個物件例項具體屬於哪種型別

3. constructor(建構函式)

當一個函式 F被定義時,JS引擎會為F新增 prototype 原型,然後再在 prototype上新增一個 constructor 屬性,並讓其指向 F 的引用。

如下所示:

JavaScript中檢測資料型別的四種方法

當執行 var f = new F() 時,F 被當成了建構函式,f 是F的例項物件,此時 F 原型上的 constructor 傳遞到了 f 上,因此f.constructor === F

JavaScript中檢測資料型別的四種方法

可以看出,F 利用原型物件上的 constructor 引用了自身,當 F 作為建構函式來建立物件時,原型上的 constructor 就被遺傳到了新建立的物件上, 從原型鏈角度講,建構函式 F 就是新物件的型別。這樣做的意義是,讓新物件在誕生以後,就具有可追溯的資料型別。

同樣,Script 中的內建物件在內部構http://www.cppcns.com建時也是這樣做的:

JavaScript中檢測資料型別的四種方法