1. 程式人生 > 其它 >資料型別的檢測方法

資料型別的檢測方法

1.typeof操作符

  

型別

輸出結果

Undefined

“undefined”

Null

“object”

Boolean

“boolean”

Number

“number”

String

“string”

Function

“function”

BigInt

“bigint”

Symbol

“symbol”

其他任何物件

“object”

 

注意事項:

  • 使用typeof操作符檢測陣列型別時輸出的是"object";
  • 除了new Function()之外,其他所有使用建構函式(new操作符)建立的變數用typeof檢測型別輸出都是"object";

 

let arr = [];
console.log(typeof arr);  //“object”

let str1 = new String(" ");
let str2 = " ";
console.log(typeof str1); //“object”
console.log(typeof str2); //"string" 

2.instanceof操作符

  object instanceof constructor

  用於檢測建構函式constructor的prototype屬性是否出現在某個例項物件object的原型鏈上。

let arr = [];
let str1 
= ""; let str2 = String(""); let str3 = new String(""); console.log(arr instanceof Array); //true console.log(str1 instanceof String); //false console.log(str2 instanceof String); //false console.log(str3 instanceof String); //true console.log(1 instanceof Number); //false console.log(new Number(1) instanceof
Number); //true

3.Object.prototype.constructor屬性

  返回建立的例項物件的建構函式的引用,該屬性的值是對建構函式本身的引用,也就是說,若輸出某物件例項的constructor屬性,輸出的是建構函式程式碼,而不是包含建構函式名的字串。

  

let arr = [];
let str1 = "";
let str2 = String("");
let str3 = new String("");
console.log(arr.constructor === Array); //true
console.log(str1.constructor === String); //true
console.log(str2.constructor === String); //true
console.log(str3.constructor === String); //true
console.log((1).constructor === Number); //true
console.log((true).constructor === Boolean); //true

 

注意事項

  • null、undefined型別的原始值是沒有constructor屬性的;
  • 對於自定義類,若重寫該類的原型屬性,有可能會導致該類的constructor不再指向該類的建構函式;

  以前文 《類的原型與類的繼承 - ˙鯊魚辣椒ゝ - 部落格園 (cnblogs.com)》中提到了組合繼承方式,該方式重寫子類的原型(SubType.prototype = new SuperType();)會導致子類的constructor屬性不再指向子類建構函式。

 

console.log(instance1.constructor === SubType); //false
console.log(instance1.constructor === SuperType); //true 

4.Object.prototype.toString()方法

  每個物件都有toString()方法,當該物件被表示為一個文字值或以預期的字串方式引用時,都會自動呼叫該方法。預設情況下,若此方法在自定義類中沒有被覆蓋,toString()返回["object type"],其中type是物件的型別。

  由於非自定義物件(如Array、String等)已經重寫了toString()方法,因此要實現資料型別檢測功能,應該利用Function.prototype.call()方法來呼叫原始的Object.prototype.toString(),使其輸出[object type],而我們只需要使用slice()方法取字串的第8位到倒數第二位,即可提取出表示資料型別的字串type。例如,下面檢測字串型別String:

 


console.log(Object.prototype.toString.call(str).slice(
8,-1)); //Stringlet str = "";