判断数据类型的几种方法
话不多说,直奔正题。
1. typeof(常用于判断基本数据类型,对于引用数据类型全部返回Object)
-
语法: typeof [检测数据] 返回数据的类型名称
-
特点
- 对于基本类型,除 null 以外,均可以返回正确的结果。
- 对于引用类型,除 function 以外,一律返回 object 类型。
- 对于 null ,返回 object 类型。
- 对于 function 返回 function 类型。
var str = '字符串类型';
var num = 123;
var bool = true;
var bignum = BigInt("1234567890123456789012345678901234567890");
var d = undefined;
var n = null;
var s = Symbol('foo');
var obj = {
a: 1 };
var arr = [1, 2]
console.log(typeof str); // string
console.log(typeof num); // number
console.log(typeof bool); // boolean
console.log(typeof bignum); // bigint
console.log(typeof d); // undefined
console.log(typeof n); // object
console.log(typeof s); // symbol
console.log(typeof obj); // object
console.log(typeof arr); // object
2. instanceof(检测某一个实例的原型链上是否有这个类的原型属性)
-
语法:[监测数据] instanceof [class] :返回true或false
-
特点:
- 可以区分复杂数据类型
- 只要在当前实例的原型链上,我们用其检测出来的结果都是true
- 基本类型值检测繁琐,且检测不全(undefined, null, symbol)
-
原理:验证当前类的原型prototype是否会出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为true。因此,
instanceof
在查找的过程中会遍历左边变量的原型链,直到找到右边变量的prototype
,找到返回true,未找到返回false -
手写instanceof
function myinstanceOf_(left, right) {
let proto = left.__proto__;
let prototype = right.prototype
while (true) {
if (proto == null) return false
if (proto == prototype) return true
proto = proto.__proto__;
}
}
3. constructor (用于引用数据类型)
- 语法: 检测数据.constructor === class
- 特点:
- 适合使用在引用数据类型上
- 原型链不会干扰
- 原理:构造函数原型上有一个 constructor 属性指向构造函数自身的,如果在实例上使用 construtor 时,就会直接使用其构造函数原型的上的该属性,并指向其构造函数。
// 可以检测其构造函数
console.log(Number(1).constructor === Number)
console.log([].constructor === Array); // true
console.log({
}.constructor === Object);// true
function Person() {
}
console.log(new Person().constructor === Person);// true
// 原型链不会干扰
console.log([].constructor === Object); // false
4. Object.prototype.toString.call()(对象原型链判断方法)
- 语法:Object.prototype.toString.call(检测数据)
- 特点:适用于所有类型的判断检测
- 原理:Object.prototype.toString 表示一个返回对象类型的字符串,call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果
console.log(Object.prototype.toString.call('asdb')) // [object String]
console.log(Object.prototype.toString.call(false)) // [object Boolean]
console.log(Object.prototype.toString.call(123)) // [object Number]
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
console.log(Object.prototype.toString.call(Symbol(1))) // [object Symbol]
console.log(Object.prototype.toString.call(null)) // [object Null]
console.log(Object.prototype.toString.call({
name: 'zs' })) // [object Object]
console.log(Object.prototype.toString.call([])) // [object Array]
console.log(Object.prototype.toString.call(function f1() {
})) // [object Function]
console.log(Object.prototype.toString.call(new Date())) // [object Date]
console.log(Object.prototype.toString.call(/\d/)) // [object RegExp]
这里需要留意的是打印出来的结果是[object XXX]的字符串,我们需要的结果XXX需要进行字符串截取才能获得。