JavaScript判断数据类型
前两天的文章中有介绍到JavaScript中的数据类型,那么今天就总结一下判断数据类型的方式吧!
1. typeof
用于判断基本数据类型和引用数据类型
console.log(typeof 123); //number
console.log(typeof '123'); //string
console.log(typeof true); //boolean
console.log(typeof null); //object
console.log(typeof undefined); //undefined
console.log(typeof Symbol()); //symbol
console.log(typeof [1,2,3]); //object
console.log(typeof {a:1}); //object
需要注意的地方是 null,通过typeof判断null的时候,会返回object,这是由于历史原因造成的,属于一个bug,1995年JavaScript语言的第一版,所有值都设计成32位,其中最低的3位用来表述数据类型,object对应的值是000。当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。这是typeof null返回object的根本原因。
2. instanceof
用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,不能判断基本数据类型,返回布尔值的形式
console.log([1,2,3] instanceof Array); //true
console.log({a:1} instanceof Object); //true
console.log(Symbol instanceof Function); //true
instanceof的内部实现也是一个常考到的面试题目,面试官会让你手动实现一个instanceof
function myInstanceOf(target,origin){
let proto = target.__proto__;
if(proto){
if(origin.prototype == proto){
return true;
}else{
return myInstanceOf(proto,origin);
}
}else{
return false;
}
}
3. constructor
返回创建此对象的数组函数的引用
缺陷:如果先创建一个对象,更改它的原型之后创建该对象的实例,这种方式就不可靠了
4. Object.prototype.toString.call()
返回一个字符串,字符串是一个数组的形式,数组的第二个参数就是变量类型
console.log(Object.prototype.toString.call([1,2,3])); //[object Array]
console.log(Object.prototype.toString.call('1,2,3')); //[object String]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(111)); //[object Number]
console.log(Object.prototype.toString.call(Symbol())); //[object Number]
console.log(Object.prototype.toString.call({a:1})); //[object Object]