方式一:使用 typeof判断
console.log(typeof 2); //number
console.log(typeof true); //boolean
console.log(typeof "str"); //string
console.log(typeof []); // object
console.log(typeof function () {}); // function
console.log(typeof {}); //object
console.log(typeof undefined); //undefined
console.log(typeof null); // Object
注意:其中数组,对象,null都会被判断为 object数据类型,其他判断正确
方式二:使用instanceof
instanceof可以正确判断对象的类型,其内部运行机制是判断其在原型链中能不能找到该类型的原型
console.log([] instanceof Array); // true
console.log(function () {} instanceof Function); // true
console.log({} instanceof Object); //true
注意事项:instanceof只能正确判断引用数据类型,不能判断基本数据,instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性
方式三:使用constuctor
constructor两个作用,判断数据类型, 对象实例通过constructor对象访问它的构造函数
console.log((2).constructor === Number);
console.log(true.constructor === Boolean);
console.log("str".constructor === String);
console.log([].constructor === Array);
console.log(function () {}.constructor === Function);
console.log({}.constructor === Object);
方式四: Object.property.toString.call() 使用对象的原型方法toString 来判断数据类型
console.log(Object.prototype.toString.call(2)); //true
console.log(Object.prototype.toString.call(true)); //true
console.log(Object.prototype.toString.call("str")); //true
console.log(Object.prototype.toString.call([])); //true
console.log(Object.prototype.toString.call(function () {})); //true
console.log(Object.prototype.toString.call({}));//true
console.log(Object.prototype.toString.call(undefined));//true
console.log(Object.prototype.toString.call(null));//true
同样检测对象obj,调用obj.toString()和 调用 Object.prototype.toString.call(obj) 结果不一样这是为什么呢? 因为toString是Object的原型方法,而Array,function,等类型作为Object的实例,都重写了toString方法