方案一:TYPEOF运算符(坑多慎用)
使用typeof
检测数据类型,首先都返回一个字符串,其次字符串中包含判断的数据类型结果
console.log(typeof 12); // "number"
console.log(typeof "leonard"); // "string"
局限性
// 不能正确检测 null
console.log(typeof null); // "object"
// 不能具体细分数组还是正则,对于对象数据类型的值返回结果都相同
console.log(typeof [1,2,3]); // "object"
console.log(typeof /^leonard$/); // "object"
console.log(typeof {age:18}); // "object"
方案二:INSTANCEOF
检测一个实例是否属于某个类
var obj = [12,23];
console.log(obj instanceof Array); // false
console.log(obj instanceof RegExp); // true
局限性
// 不能用来处理字面量创建出来的基本数据类型值
console.log(1 instanceof Number); // false
console.log("" instanceof String); // false
// 只要在当前实例的原型链上,检测结果都是true
var ary = [];
console.log(ary instanceof Array); // true
console.log(ary instanceof Object); // true
var oDiv = document.createElement('div');
console.log(oDiv instanceof EventTarget); // true
console.log(oDiv instanceof Object); // true
console.log(oDiv instanceof Node); // true
// 在类的原型继承中,该方法检测的结果不一定准确
var Fn = function(){};
Fn.prototype = new Array;
var f = new Fn;
console.log(f instanceof Array); // true
方案三:CONSTRUCTOR构造函数
作用和instanceof
非常相似
// 可以处理基本数据类型的检测
var num = 1;
console.log(num.constructor === Number); // true
// 检测Object时和instanceof表现不一样
var reg = /^$/;
console.log(reg.constructor === RegExp); // true
console.log(reg.constructor === Object); // false
局限性
// 重写类的原型后很可能将constructor覆盖而导致结果不准确
var Fn = function(){};
Fn.prototype = new Array;
var f = new Fn;
console.log(f.constructor); // Array
方案四:Object.prototype.toString.call(强烈推荐)
首先获取Object
原型上的toString
方法(该方法的作用是返回当前方法的执行主体所属类的详细信息),让方法执行并改变方法中的this
关键字指向
var a = Object.prototype.toString;
console.log(a.call("aaa")); // "[object String]"
console.log(a.call(1)); // "[object Number]"
console.log(a.call(true)); // "[object Boolean]"
console.log(a.call(null)); // "[object Null]"
console.log(a.call(undefined)); // "[object Undefined]"
console.log(a.call([])); // "[object Array]"
console.log(a.call(function() {}));// "[object Function]"
console.log(a.call({})); // "[object Object]"
var Fn = function(){};
Fn.prototype = new Array;
var f = new Fn;
console.log(a.call(f) === "[object Array]"); // false
补充:null
和undefined
所属类分别为Null
和Undefined
,但是浏览器将其保护起来,不允许外部访问使用,所以会产下以下结果