跳到主要内容
Huiboxes

JS 判断数据类型

JavaScript 的数据类型,以及 typeof、instanceof、constructor、Object.prototype.toString 等判断方式各自的适用场景。

前端1分钟阅读

JavaScript是一个弱类型语言,不需要声明变量的类型,意为着一个变量可以存储任意类型的数据。代码执行的时候数据的类型由JS引擎自动确定。JS中数据分为基本类型和引用类型。基本类型有numberstringbooleannullundefined(新标准中增加了symbolBigInt类型)。引用类型有objectfunctionarray,其实functionarray本质上也是对象(object)。

怎样可以知道一个变量存储的数据是什么类型呢?通常使用typeof函数:

var a = 1;
typeof a; //返回number typeof a 与 typeof(a)等效
var b = 'data';
typeof b; //返回string
var c = true;
typeof c; //返回boolean
var t = null;
typeof t; //返回object
var d = [1, 'data', true];
typeof d; //返回object

是不是从第8行开始有点疑惑?前面不是说的null是基本类型吗,为什么返回的是object呢?或者说什么时候typeof会返回objectnullundefined的意思有点类似,它们有什么区别呢?其实这是历史遗留的问题,不用太过深究。声明了一个变量但是没有赋值,那么它初始值就是undefined,如果赋值一个对象,那么就是objectnull的定义是一个未设置对象的值的值。说白了,一个变量打算是对象,但是还未想好属性值。那么就给它赋值null,代表这个变量以后存储的是对象。第10行说明如果判断基本类型,typeof够用。但是引用类型如果要判断具体类型的话,不一定。复杂类型应该使用instanceof,如:

var a = {};
var b = [1, 2];
var c = function () {};
var d = 1;
var e = new Number(1);
a instanceof Object; //返回true
b instanceof Array; //返回true
c instanceof Function; //返回true
d instanceof Number; //返回false
e instanceof Number; //返回true

用它同样可以判断基本类型的数据,那为什么先用typeof举例子引出instanceof呢?因为instanceof在判断基本类型时,不是用new声明的类型,就返回falsenullundefined都是返回false。综上所述,判断一个变量是什么类型时通常使用typeof,然后用instanceof。基本类型用typeof,引用类型用instanceof

JS可以把基本类型临时转换成对象,于是偶然间发现

也就是说可以通过判断构造函数来判断数据类型了

var a = 1;
a.constrructor === Number; //返回true

不过undefinednull不能用此方法。

通过某个对象调用toString方法也可以判断,如下:

var a = 1;
var b = {};
var c = [];
var d = function () {};
toString.call(a); //返回[object Number
toString.call(b); //返回[object Object]
toString.call(c); //返回[object Array]
toString.call(d); //返回[object Function]
//用apply效果自然也是一样的

评论