# 4.类型判断
作者:喵喵同学嘛 链接:https://www.jianshu.com/p/ddc7f189d130 来源:简书
# 1. typeof(识别除了 null 之外的基本类型)
console.log(typeof bool); //boolean
console.log(typeof num); //number
console.log(typeof str); //string
console.log(typeof und); //undefined
console.log(typeof nul); //object
console.log(typeof arr); //object
console.log(typeof obj); //object
console.log(typeof fun); //function
console.log(typeof s1); //symbol
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- typeof 可以识别出基本类型 boolean,number,undefined,string,symbol,但是不能识别 null。不能识别引用数据类型,会把 null、array、object 统一归为 object 类型,但是可以识别出 function。 所以 typeof 可以用来识别一些基本类型
# 2. instanceof(判断引用类型和继承关系)
console.log(bool instanceof Boolean); // false
console.log(num instanceof Number); // false
console.log(str instanceof String); // false
console.log(und instanceof Object); // false
console.log(nul instanceof Object); // false
console.log(arr instanceof Array); // true
console.log(obj instanceof Object); // true
console.log(fun instanceof Function); // true
console.log(s1 instanceof Symbol); // false
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
从结果中看出 instanceof不能识别出基本的数据类型 number、boolean、string、undefined、unll、symbol。 但是可以检测出引用类型,如 array、object、function,同时对于是使用 new 声明的类型,它还可以检测出多层继承关系。 其实也很好理解,js 的继承都是采用原型链来继承的。比如 objA instanceof A ,其实就是看 objA 的原型链上是否有 A 的原型,而 A 的原型上保留 A 的 constructor 属性。 所以instanceof 一般用来检测对象类型,以及继承关系。
# 3.Object.prototype.toString.call
console.log(Object.prototype.toString.call(bool)); //[object Boolean]
console.log(Object.prototype.toString.call(num)); //[object Number]
console.log(Object.prototype.toString.call(str)); //[object String]
console.log(Object.prototype.toString.call(und)); //[object Undefined]
console.log(Object.prototype.toString.call(nul)); //[object Null]
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(Object.prototype.toString.call(obj)); //[object Object]
console.log(Object.prototype.toString.call(fun)); //[object Function]
console.log(Object.prototype.toString.call(s1)); //[object Symbol]
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
此方法可以相对较全的判断 js 的数据类型。 至于在项目中使用哪个判断,还是要看使用场景,具体的选择,一般基本的类型可以选择 typeof,引用类型可以使用 instanceof。
# 判断是不是函数
# 1. fun1 instanceOf Function
# 2. fun1.__proto__
== Function.prototype
# 3. typeof
# 4. Object.prototype.toString.call() =>// '[object Function]'
# 5. constructor
# 判断是不是数组
# 1. arr1 instanceOf Array
# 2. arr1.__proto__
==Array.prototype
# 3. Array.isArray(最好用的)
# 4. Object.prototype.toString.call() =>//'[object Array]'
# 5. constructor
关于判断方法更详细介绍看:js 类型判断 (opens new window)
← 3.隐式类型转换 5.作用域链和原型链 →