概要: 之所以写这篇文章是对之前Javascript数据类型判断感到模糊的地方的总结,如果你之前也对程序中的一个未知变量的类型判断感到疑惑,可以看看这篇文章,如果你自认为拿到一个变量后完全可以知道这是什么类型,就无需再看这篇文章了,不要浪费宝贵的学习时间。
1. 前提准备:
var array = [1]; // 数组类型
var string = "string"; // 字符串
var object = {foo:1}; // 字面量定义的对象
var number = 10; // 数字
var boo = true; // 布尔
var no = null; // null
上面这些是最常见的数据类型了,我只列举这些了,基本会了这些的判断就可以判断所有的数据类型了。
2. 最方便的方法Object.toString.call(变量) 结合正则去判断
以下是一种场景,判断array变量是否是数组:
var array = [1];
// 假设不知道上一句话,在程序中拿到手的就是array
var foo = Object.prototype.toString.call(array); // 这一句返回的字符串是判断的依据
// 利用正则去判断foo是不是数组
if (/\[object Array\]/.test(foo)) {
// 是Array类型就打印foo
console.log(foo);
}
上面的var foo = Object.prototype.toString.call(array);和/\[object Array\]/.test(foo)是最重要的两句。
第一句的输出结果就是类似于[object x]唯一的不同就在于x,每种不同的数据类型返回的x都不一样,如数组是Array而字符串是String等待。
如果两句话看不懂,可能需要去补一下原型和call方法以及正则的知识了。
第二句的正则判断更简单了,利用正则对象的test方法去匹配判断是否是我们想要的类型。
这种方法只能判断一种变量是否是我们想要的类型,如果你想一次性写好所有方法便于以后判断,可以写类似这样的函数
isArray: function(foo) {
if (!foo) {
return false;
}
var bar = Object.prototype.toString.call(foo);
if (/\[object Array\]/.test(bar)) {
return true;
}
return false;
}
只要按照数据类型依次去扩展这样的方法,就可以判断所有的数据类型了,很多框架都封装有这样的方法,如我们公司的框架或者lodash等等。
不过判断数据类型不必完全采取这种正则加toString的方式,可以视情况而定,例如判断数据是不是数组就有利用原型链判断或者instanceof操作符等等,不必拘泥于一种固定方式,只是这种方式比较统一有效。