1. 程式人生 > 前端設計 >JavaScript中準確判斷資料型別的方法

JavaScript中準確判斷資料型別的方法

js中準確判斷資料型別的方法

強烈推薦的Markdown編寫工具Markdown Nice,點選該連結詳細琢磨

1: typeof

返回資料型別,包含這7種: number、boolean、symbol、string、object、undefined、function。

typeof null 返回型別錯誤,返回object

引用型別,除了function返回function型別外,其他均返回object。

其中,null 有屬於自己的資料型別 Null , 引用型別中的 陣列、日期、正則 也都有屬於自己的具體型別,而 typeof 對於這些型別的處理,只返回了處於其原型鏈最頂端的 Object 型別,沒有錯,但不是我們想要的結果。


2: toString (這個最準確,比較推薦)

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全域性物件 global 的引用
複製程式碼

3: constructor

constructor是原型prototype的一個屬性,當函式被定義時候,js引擎會為函式新增原型prototype,並且這個prototype中constructor屬性指向函式引用, 因此重寫prototype會丟失原來的constructor。

不過這種方法有問題:

1:null 和 undefined 無constructor,這種方法判斷不了。

2:還有,如果自定義物件,開發者重寫prototype之後,原有的constructor會丟失,因此,為了規範開發,在重寫物件原型時一般都需要重新給 constructor 賦值,以保證物件例項的型別不被篡改。

''.constructor==String
true
(1).constructor==Number
true
false.constructor==Boolean
true
[].constructor==Array
true
複製程式碼

4: instanceof

instanceof 是用來判斷 A 是否為 B 的例項,表示式為:A instanceof B,如果 A 是 B 的例項,則返回 true,否則返回 false。 在這裡需要特別注意的是:instanceof 檢測的是原型

var arr=[1,2,3];
arr instanceof Array
true
var str='abc';
str instanceof String
false //因為這是基本型別,instanceof只是用來判斷物件的
var str2=new String('abc');//用new生成的字串'abc'屬於,string包裝物件,本身是一個物件,所以可以檢測
str2 instanceof String
true
var o={name:'Tom'};
o instanceof Object
true
複製程式碼

關於包裝物件的介紹地址連結

注意:推薦除了以上說的方法判斷資料型別外,判斷一個數據型別是陣列還以可以用Array.isArray([])

本文使用 mdnice 排版