js类型详解

js中获取变量类型

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// js 中类型type: 
// Number Boolean String Function Array Date RegExp Null Undefined Object

// 使用typeof
let arr = [1, 2, 3];
// typeof 的缺点就是 会把Array和Date和RexExp和null判断为object
console.log('1', typeof arr); // object
function xixi() {}
console.log('2', typeof xixi); // function
let obj = {};
console.log('3', typeof obj); // object


// 使用constructor 或者constructor.name
console.log('44', arr.constructor) // Array
console.log('4', arr.constructor.name === 'Array') // true

console.log('5', typeof arr.constructor); // function

class Hello {}
console.log('6', typeof Hello); // function
let hello = new Hello();
console.log('7', typeof hello); // object
console.log('8', hello.constructor.name) // Hello


// 使用 instanceof判断
console.log('9', arr instanceof Array); // true

console.log('10', (typeof arr === 'object') && (arr.constructor.name === 'Array')); // true


// 原型判断
console.log('11', Object.prototype.toString.call(arr)) // [object Array]


function type(obj) {
let class2type = {};
let objs = "Boolean Number String Function Array Date RegExp Null Undefined".split(" ");
objs.forEach(obj => {
class2type[`[object ${obj}]`] = obj.toLocaleLowerCase();
});
return class2type[Object.prototype.toString.call(obj)] || 'object';
}

console.log(type(arr)); // array
console.log(type(hello)); // object
let u;
console.log(u); // undefined
console.log(null); // null
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(typeof null) // object 这个js的一个缺陷。
console.log(typeof u); // undefined

console.log(Object.prototype.toString.call(arr)); // [object Array]
console.log(Object.prototype.toString.call(hello)); // [object Object]
console.log(Object.prototype.toString.call(xixi)) // [object Function]
console.log(Object.prototype.toString.call(hello.constructor)) // [object Function]
let reg = /^\s*|\s*^/g;
console.log(Object.prototype.toString.call(reg)); // [object RegExp]
console.log(typeof reg) // object
console.log(typeof 12); // number
console.log(typeof new Date()) // object