js判断数据类型
# 一、typeof
typeof 1
"number"
typeof NaN
"number"
typeof "1"
"string"
typeof true
"boolean"
typeof undefined
"undefined"
typeof null
"object"
typeof []
"object"
typeof {}
"object"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
其中
null, [], {} 都返回 "object"
所以 typeof 无法判断数组、null、对象
typeof null 为 'object'的 bug
根据 C 语言的传统,null 被设计成可以自动转为 0。js 里也是一样
JavaScript 中的数据在底层是以二进制存储,比如 null 所有存储值都是 0,但是底层的判断机制,只要前三位为 0,就会判定为 object,所以才会有 typeof null === 'object'这个 bug。
# instanceof
var a = {};
a instanceof Object //true
var b = [];
b instanceof Array //true
1
2
3
4
5
6
7
2
3
4
5
6
7
需要注意的是,instanceof只能用来判断对象和函数,不能用来判断字符串和数字等基础类型
var b = '123';
alert(b instanceof String); //false
var c = new String("123");
alert(c instanceof String); //true
1
2
3
4
5
6
7
2
3
4
5
6
7
# Object.prototype.toString.call()
call()方法可以改变this的指向,那么可以把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果
Object.prototype.toString.call(1)
"[object Number]"
Object.prototype.toString.call(NaN);
"[object Number]"
Object.prototype.toString.call("1");
"[object String]"
Object.prototype.toString.call(true)
"[object Boolean]"
Object.prototype.toString.call(null)
"[object Null]"
Object.prototype.toString.call(undefined)
"[object Undefined]"
Object.prototype.toString.call(function a() {});
"[object Function]"
Object.prototype.toString.call([]);
"[object Array]"
Object.prototype.toString.call({});
"[object Object]"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
这种方法可以判断所有类型
# 终极方法
第一二种方法都有局限性,所以我们可以基于Object.prototype.toString.call()封装一个函数
function mytypeof(obj){
var s = Object.prototype.toString.call(obj)
return s.match(/\[object (.*?)\]/)[1].toLowerCase()
}
1
2
3
4
2
3
4
mytypeof([12,3,343])
"array"
mytypeof({name: 'zxc', age: 18})
"object"
mytypeof(1)
"number"
mytypeof("1")
"string"
mytypeof(null)
"null"
mytypeof(undefined)
"undefined"
mytypeof(NaN)
"number"
mytypeof(Date)
"function"
mytypeof(new Date())
"date"
mytypeof(new RegExp())
"regexp"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
上次更新: 2023/04/05, 09:41:10