总结JS中判断数据类型的几种方式
这几种应该也是用的比较多、涵盖范围广的类型检测方式,新特性提供的一些也可用其实现。
1、Object.prototype.toString.call(target)
-
我认为这应该是最精准的类型校验,也比较严谨,能具体的区分基础数据类型 和引用数据类型,能准确知道 target 的具体类型。
-
他还有另一种写法就是将Object变成 {} 形式,在JS种它俩指向的原型一样。
Object.prototype.toString.call(123);
Object.prototype.toString.call("hello");
Object.prototype.toString.call(true);
Object.prototype.toString.call(undefined);
Object.prototype.toString.call(null);
Object.prototype.toString.call({});
Object.prototype.toString.call([]);
Object.prototype.toString.call(function(){});
Object.prototype.toString.call((function() { return arguments;})());
Object.prototype.toString.call(/\w/);
Object.prototype.toString.call(new Date());
-
而随着ES6推出Symbol后,有了Symbol.toStringTag属性。
-
我理解为它期待将一个属性值作为泛型,用于规范化。
let A = class {};
A.prototype[Symbol.toStringTag] = "A";
Object.prototype.toString.call(new A());
2、typeof
-
只能识别基础类型和引用类型,且对数组和对象的识别都为Object。
-
NaN会被识别为number类型。
-
一般用来检测具体的基础类型。
console.log(typeof 123);
console.log(typeof "hello");
console.log(typeof true);
console.log(typeof undefined);
console.log(typeof null);
console.log(typeof {});
console.log(typeof []);
console.log(typeof function(){});
console.log(typeof null);
console.log(typeof NaN);
3、instanceof
-
一般用来检测target是否属于某一具体type,且只可判断引用类型。
-
它的返回值是Boolean型。
-
其实现原理是type的原型对象是否为target原型链上的某个对象。
const target = { name: "丽丽", age: 18 }
console.log(target instanceof Object);
console.log(target instanceof Array);
4、is变量
-
Array.isArray(target),检测target是否为数组,返回布尔值。
-
Object.is(target1,target2),检测target1、target2是否为相同数值,且为严谨类型,返回布尔值。
-
Number.isNaN(target) ,检测target是否为 NaN,返回布尔值。
console.log(Array.isArray([1, 2, 3]));
console.log(Array.isArray({}));
console.log(Number.isNaN(NaN));
console.log(Number.isNaN(123));
console.log(Object.is('1', 1));
console.log(Object.is(1, 1));