資料型別的檢測方法
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) instanceofNumber); //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 = "";