JS判断数据类型的5种⽅法
我们先来了解⼀下JS中数据类型有哪些
基本数据类型(值类型):String、Number、boolean、null、undefined、symbol(es6新增的)
引⽤数据类型 (引⽤类型):object。包含 Function、Array、Date、RegExp、Error等都是属于 Object 类型 。
⼀、typeof
通常⽤来判断基本数据类型,它返回表⽰数据类型的字符串(返回结果只能包括
number,boolean,string,function,undefined,object); *注意,使⽤typeof来判断null和引⽤类型 返回的结果都是 'object'可以使⽤typeof判断变量是否存在(如if(typeof a!="undefined"){...});
typeof 1          //number
typeof 'a'        //string
typeof true        //boolean
typeof undefined  //undefined
typeof null        //object
typeof {}          //object
typeof [1,2,3]    //object
function Fn(){}
typeof new Fn()    //object
typeof new Array() //object
⼆、instanceof
使⽤instanceof,如:a instanceof A 根据instanceof的定义:判断参照对象(⼤写字母A)的prototype属性所指向的对象是否在被⾏测对象a的原型链上,instanceof 只能⽤来判断两个对象是否属于实例关系,⽽不能判断⼀个对象实例具体属于哪种类型,例如:
function A(name,age){
this.name = name;
this.age = age;
}
a = new A('张三',18);
console.log(a instanceof A)  //true
obj = new Object()//创建⼀个空对象obj
typeof array
//或者通过字⾯量来创建:
obj = {}
console.log(obj instanceof Object); // true
arr = new Array()  //创建⼀个空数组arr  或arr = []
console.log(arr instanceof Array ); // true
date = new Date()
console.log(date instanceof Date ); // true
// 注意:instanceof后⾯⼀定要是对象类型,instanceof前⾯相当于它的实例对象,
// 后⾯的对象类型⼤⼩写不能写错,该⽅法试⽤⼀些条件选择或分⽀
但是这种⽅式判断有个弊端:对于number,string,boolean这三种基本数据类型,
只有通过构造函数定义⽐如:let num =new Number(1);这样定义才能检测出。
let num = 1; 这样定义是检测不出来的
简单实现instanceof:
function my_instanceof(L, R) {
const O = R.prototype;
if (L === null) {
return false;
}
L = L.__proto__;
while (true) {
if (L === null) {
return false;
}
if (L === O) {
return true;
}
L = L.__proto__;
}
}
三、根据constructor判断
针对于instanceof的弊端,我们使⽤constructor检测,constructor是原型对象的属性指向构造函数。
console.log('数据类型判断 -  constructor');
let num = 23;
let date = new Date();
let str = "biu~";
let reg = new RegExp();
let bool = true;
let fn = function () {
console.log(886);
};
let udf = undefined;
let nul = null;
let array = [1, 2, 3];
console.structor); // [Function: Number]
console.structor); // [Function: Date]
console.structor); // [Function: String]
console.structor); // [Function: Boolean]
console.structor); // [Function: Function]
console.structor); // [Function: RegExp]
console.structor); // [Function: Array]
这种⽅式解决了instanceof的弊端,可以检测出除了undefined和null的9种类型(因为它两没有原⽣构造函数)
console.structor);//Cannot read property "constructor" of undefined
console.structor);//Cannot read property "constructor" of null
四、通过Object下的toString.call()⽅法来判断
在《你不知道的javaScript》(中卷)中讲到:所有typeof返回值为"object"的对象,都包含⼀个内部属性[[Class]],我们可以把他看作⼀个内部的分类,⽽⾮传统意义上⾯向对象的类,这个属性⽆法直接访问,⼀般通过String(…)来查看。并且对于基
本数据类类型null,undefined这样没有原⽣构造函数,内部的[[Class]]属性值仍然是Null和Undefined
String.call();
console.log(toString.call(123));          //[object Number]
console.log(toString.call('123'));        //[object String]
console.log(toString.call(undefined));    //[object Undefined]
console.log(toString.call(true));        //[object Boolean]
console.log(toString.call({}));          //[object Object]
console.log(toString.call([]));          //[object Array]
console.log(toString.call(function(){})); //[object Function]
五、jq中判断数据类型的⽅法
jQuery提供了⼀系列⼯具⽅法,⽤来判断数据类型,以弥补JavaScript原⽣的typeof运算符的不⾜。以下⽅法对参数进⾏判断,返回⼀个布尔值。
jQuery.isArray();是否为数组
jQuery.isEmptyObject();是否为空对象 (不含可枚举属性)。
jQuery.isFunction():是否为函数
jQuery.isNumberic():是否为数字
jQuery.isPlainObject():是否为使⽤“{}”或“new Object”⽣成对象,⽽不是浏览器原⽣提供的对象。
jQuery.isWindow(): 是否为window对象;
jQuery.isXMLDoc(): 判断⼀个DOM节点是否处于XML⽂档中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。