前言
首先得知道js数据类型,分为基本数据类型和复杂数据类型。
基本数据类型
Number(数值类型),String(字符串),Boolean(布尔型),null(空对象),undefined(未初始化变量),Symbol(唯一标识符),Bigint(比Number范围更大的数值型)
复杂数据类型
Object
检测基本数据类型
typeof 返回对应的类型
var n='abc'
console.log(typeof(n))//String
检测复杂类型
1.instanceof 返回一个布尔值
注:instanceof只能检测一个实例是不是属于某个类,不能检测NUll和Undefined。
console.log([1,2,3] instanceof Array)//true
console.log(123 instanceof Number)//false 不能检测基本数据类型
2.constructor 返回一个布尔值
注:constructor属性存在于构造函数的原型上,指向构造函数,对象可以通过proto在其所属类的原型上找到这个属性,但不能检测实例化的函数。
console.log(("1,2,3").constructor===String)//true
console.log(([1,2,3]).constructor===Array)//true
console.log((Function(){}).constructor===Function)//true
一个小小的不同
function Fn(){};
Fn.prototype=new Array();
var f=new Fn();
console.log(f.constructor===Fn); //false
console.log(f.constructor===Array); // true
3.Object.prototype.toString.call()
上面两种方法都有局限,第三种方法解决了上面的问题
console.log(Object.prototype.toString.call(345)); //[object Number]
console.log(Object.prototype.toString.call('huhuhuh')); //[object String]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(/^$/)); //[object RegExp]
console.log(Object.prototype.toString.call((function () {}))); //[object Function]