JavaScript数据类型检测的四种方式
1. typeof
返回值是字符串,有”number”,”boolean”,”string”,”undefined”,”function”,”object”
console.log(typeof typeof function () {
}); // "string"
typeof的局限性: 不能区分数组,对象,正则,因为返回的都是”object”
console.log(typeof null); // "object"
var obj = {a: 1};
var arr = [1, 2];
var reg = new RegExp();
console.log(typeof obj); // "object"
console.log(typeof arr); // "object"
console.log(typeof reg); // "object"
typeof使用场景——检测函数的参数是否传址
function fn(m, n) {
if (typeof n === "undefined") { // 没传值
n = 0;
}
console.log(m, n);
}
fn(1);
function fn(callback) {
typeof callback === "function" ? callback() : null;
}
fn(function () {
});
2. instanceof 检测一个实例是否属于某个类
var arr = [1, 2];
console.log(arr instanceof Array); // true
console.log(arr instanceof RegExp); // false
console.log(arr instanceof Object); // true
局限性
1.只要在当前实例的原型链上,我们用其检测出来的结果都是true
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
function fn() {}
console.log(fn instanceof Function); // true
console.log(fn instanceof Object); // true
2. 对于基本数据类型,字面量方式无法检测,可以检测出实例创建方式的值。只有实例方式创建出来的才是标准的对象数据类型值,也是Number这个类的一个实例
console.log(1 instanceof Number); // false
console.log(new Number(1) instanceof Number); // true
3. constructor 构造函数
3.1 检测基本数据类型
var arr = [];
console.log(arr.constructor === Array); // true
var num = 1;
console.log(num.constructor === Number); // true
3.2 检测Object
var reg = new RegExp();
console.log(reg.constructor === RegExp); // true
console.log(reg.constructor === Object); // false
局限性:若把类的原型进行重写,若覆盖掉,检测结果就不准确
4. Object.prototype.toString.call() 最全面的方式
首先获取Object原型上的toString方法,让方法执行,并且改变方法中的this指向
Object.prototype.toString 返回当前方法的执行主体(this)所属类
var obj = {key: 1};
console.log(obj.toString()); // "[object Object]" 第一个object代表当前实例是对象数据类型,第二个object代表的是obj所属的类是Object
Math.toString() // "[object Math]" toString中的this指向Math,那么返回的是Math所属类的信息
var arr = [];
console.log(Object.prototype.toString.call(arr)); // [object Array]
console.log(Object.prototype.toString.call(/^$/)); // [object Regexp]
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call('foo')); // [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(function () {
})); // [object Function]
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
toString
toString方法不仅仅是转换为字符串
1. 对于Number、String、Boolean、Array、RegExp、Date、Function原型上的toString方法都是把当前的数据类型转换为字符串的类型
console.log((1).toString()); // "1"
2. Object.prototype.toString 不是用来转换为字符串的
({key:1}).toString(); // "[object Object]"
console.log(Math.toString()); // "[object Math]"