最近項目中有不少地方需要判斷數據類型,但是判斷數據類型也有好幾種方法,并且每種方法判斷的數據類型也有局限性,所以想總結一下,方便以后查閱。
分別是 ,,...call()
它返回值是一個字符串,該字符串說明運算數的類型。返回結果只有以下幾種:,,,,,
可以使用判斷變量是否存在(比如 if( a!=“”){ xxx }),而不要去使用if(a),因為a不存在(未聲明)會報錯。
無法判斷對象和數組js校驗是否為數字,還有null,因為都返回的是對于數字類型的操作數而言, 返回的值是 。比如:(1),返回的值就是。對于字符串類型, 返回的值是 。比如:(“123”),返回的值是。對于布爾類型, 返回的值是 。比如:(true),返回的值是。對于對象、數組、null 返回的值是 。比如:(),(),(null)返回的值都是。對于函數類型,返回的值是 。比如:(eval),(Date)返回的值都是。如果運算數是沒有定義的(比如說不存在的變量、函數或者),將返回。 比如:(sss)、()都返回。
下面 我們將用程序代碼驗證一下:
.log((1)); //
.log((NaN)); //
.log(("123")); //
.log(("123" + 12)); //
.log(("123" + Date)); //
.log((true)); //
.log(()); //
.log(()); //
.log((null)); //
.log(([8])); //
.log(({a:1})); //
.log((Date)); //
.log((sss)); //
.log(()); //
1
2
3
4
5
6
7
8
9
10
11
12
13
14
局限性:
由上面程序代碼可驗證,很遺憾的一點是, 在判斷一個 的數據的時候只能告訴我們這個數據是 , 而不能細致的具體到是哪一種 。所以要 想區分對象、數組、null,單純使用 是不行的。
運算符
是用來 判斷數據是否是某個對象的實例,返回一個布爾值。
基本用法:
// 判斷 obj 是否為 的實例
(name) {
??this.name?? = name
}
const p = new ('')
p // true
// 這里的 p 是 函數構造出來的,所以順著 p 的原型鏈可以找到的構造函數
p.proto === . // true
p.proto.proto === . // true
1
2
3
4
5
6
7
8
9
10
缺點:
對于基本類型的數據,是不能直接判斷它的類型的,因為實例是一個對象或函數創建的,是引用類型,所以需要通過基本類型對應的 包裝對象 來判斷。所以對于 null 和 這兩個家伙就檢測不了了~
5 // false
new (5) // true
1
2
因為原型鏈繼承的關系, 會把數組都識別為 對象,所有引用類型的祖先都是 對象
let arr = [1,2,3]
.log(...call(arr) === '[ Array]') // true
.log(arr Array) // true
.log(arr ) // true
let fn = (){}
.log(fn ) // true
1
2
3
4
5
6
下面介紹一種方法,對每一種數據類型都實用的。
...call()
在判斷數據類型時,我們稱 .. 為 “萬能方法” “終極方法”,工作中也是比較常用而且準確。
對于..() 方法,會返回一個形如 “[ XXX]” 的字符串判斷基本類型
...call('stjd')
//"[ ]"
...call(1)
//"[ ]"
...call(true)
//"[ ]"
...call(null)
//"[ Null]"
...call()
//"[ ]"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2) 判斷原生引用類型
a 函數類型
...call((){}) //這個方法就建立在js任何類型皆可視為對象**
// "[ ]"
1
2
b 日期類型
var date = new Date();
...call(date);
//”[ Date]”
1
2
3
c 數組類型
...call([2])
//"[ Array]"
1
2
d 對象類型
...call({q:8})
//"[ ]"
1
2
e 正則表達式
var reg = /[hbc]at/gi;
...call(reg); // "[ ]"
1
2
f 自定義類型
(name, age) {
??this.name?? = name;
this.age = age;
}
var = new ("Rose", 18);
...call();
//”[ ]”
1
2
3
4
5
6
7
顯然這種方法不能準確判斷是類的實例,而只能用 操作符來進行判斷,如下所示:
.log( );//輸出結果為true
1
注意:
..()本身是允許被修改的,而我們目前所討論的關于..()這個方法的應用都是假設()方法未被修改為前提的。
因為實例對象有可能會自定義()方法,會覆蓋..(), 所以在使用時,最好加上call()。
有的時候我們也可以封裝判斷數據類型的方法。
// 判斷數據類型的函數
(data) {
...call(data).slice(8, -1);
}
// 使用
if(this.(json) == ''){
.log('類型')
}else if (this.(json) == 'Array'){
.log('Array類型')
}
1
2
3
4
5
6
7
8
9
10
11
12
4. 補充 Array.() 方法
js中的()是Array類型的一個靜態方法,使用它可以判斷一個值是否為數組。
返回一個布爾值。
var arr = [1,2,3]
.log(Array.(arr)) //true
1
2
該方法可直接返回布爾值,在條件表達式中,使用該方法非常實用。
總結:
js數據類型的判斷主要有三種方法: ,,...call()
可以區分 原始類型,和 數據類型
...call() 區分的數據類型適用范圍更大,但是無法區分自定義對象類型
區分自定義對象類型使用 操作符
js中null:即是對象,又不是對象,史稱【薛定諤的對象】
判斷數據類型方法有很多js校驗是否為數字,實際使用需要根據自己的需求使用最適合自己的方法
參考:
...call()方法使用
最全的判斷數據類型的方法
講的比較好