js类型检测

类型检测

1.typeof

数组,null, object会打印相同值 需要二次校验

1
2
3
4
5
6
7
8
console.log(typeof 2);               // number
console.log(typeof true); // boolean
console.log(typeof 'str'); // string
console.log(typeof function(){}); // function
console.log(typeof undefined); // undefined
console.log(typeof {}); // object
console.log(typeof []); // object []数组的数据类型在 typeof 中被解释为 object
console.log(typeof null); // object null 的数据类型被 typeof 解释为 object

2.Object.prototype.toString.call(x)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var a = Object.prototype.toString;

console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('str'));
console.log(a.call([]));
console.log(a.call(function(){}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));

// [object Number]
// [object Boolean]
// [object String]
// [object Array]
// [object Function]
// [object Object]
// [object Undefined]
// [object Null]

3.instanceof

1
2
3
4
5
6
7

console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log('str' instanceof String); // false
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object); // true

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。其意思就是判断对象是否是某一数据类型(如Array)的实例,请重点关注一下是判断一个对象是否是数据类型的实例。在这里字面量值,2, true ,’str’不是实例,所以判断值为false

null 和 undefined 报异常

4.constructor

1
2
3
4
5
6
7
console.log(bool.constructor === Boolean);// true
console.log(num.constructor === Number);// true
console.log(str.constructor === String);// true
console.log(arr.constructor === Array);// true
console.log(obj.constructor === Object);// true
console.log(fun.constructor === Function);// true
console.log(s1.constructor === Symbol);//true

null、undefined没有construstor方法,因此constructor不能判断undefined和null,并且它是不安全的,因为contructor的指向是可以被改变