JS数据类型检测方法

方案一: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

补充nullundefined所属类分别为NullUndefined,但是浏览器将其保护起来,不允许外部访问使用,所以会产下以下结果

你可能感兴趣的:(JS数据类型检测方法)