判断数据类型的几种方法
话不多说,直奔正题。
1. typeof(常用于判断基本数据类型,对于引用数据类型全部返回Object)
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);
console.log(typeof num);
console.log(typeof bool);
console.log(typeof bignum);
console.log(typeof d);
console.log(typeof n);
console.log(typeof s);
console.log(typeof obj);
console.log(typeof arr);
2. 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);
console.log({}.constructor === Object);
function Person() { }
console.log(new Person().constructor === Person);
console.log([].constructor === Object);
4. Object.prototype.toString.call()(对象原型链判断方法)
- 语法:Object.prototype.toString.call(检测数据)
- 特点:适用于所有类型的判断检测
- 原理:Object.prototype.toString 表示一个返回对象类型的字符串,call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果
console.log(Object.prototype.toString.call('asdb'))
console.log(Object.prototype.toString.call(false))
console.log(Object.prototype.toString.call(123))
console.log(Object.prototype.toString.call(undefined))
console.log(Object.prototype.toString.call(Symbol(1)))
console.log(Object.prototype.toString.call(null))
console.log(Object.prototype.toString.call({ name: 'zs' }))
console.log(Object.prototype.toString.call([]))
console.log(Object.prototype.toString.call(function f1() { }))
console.log(Object.prototype.toString.call(new Date()))
console.log(Object.prototype.toString.call(/\d/))
这里需要留意的是打印出来的结果是[object XXX]的字符串,我们需要的结果XXX需要进行字符串截取才能获得。
|