JavaScript 如何判断类型
早上整理网页代码时,我发现一个小问题:明明给年龄输入框填了“25”,可程序偏偏说它不符合数字要求,反复检查才发现,这个“25”是带引号的字符串,不是真的数字。这让我意识到,JavaScript里判断数据类型,是写代码时特别基础但又容易踩坑的一步。
不同编程语言判断数据的方式可能不一样,JS因为是弱类型语言,同一个变量可以一会儿存文字,一会儿存数字,判断类型就更需要细心。新手刚接触JS时,常会把字符串的“123”和数字123混为一谈,结果导致代码出错,所以先掌握几种判断类型的实用方法,能少走很多弯路。

最常用:typeof 运算符
typeof是JS里判断类型最顺手的工具,用法很简单,只要在变量前加typeof,就能返回对应的类型字符串。举个生活化的例子,把变量比作装东西的盒子,typeof就是盒子表面贴的标签,直接告诉你盒子里装的是“数字”“文字”这类东西。
比如:
- 存数字的盒子:typeof 25 → 输出"number"
- 存文字的盒子:typeof "你好" → 输出"string"
- 存布尔值的盒子:typeof true → 输出"boolean"
- 存undefined的空盒子:typeof undefined → 输出"undefined"
- 存函数的盒子:typeof function(){} → 输出"function"
它的优点是使用简单,大部分基础类型都能准确判断,但也有个明显的坑:如果盒子是空的对象,比如const obj = {},typeof它会输出"object";就连数组、日期这些特殊盒子,typeof也都会返回"object",没法区分到底是普通盒子还是数组盒子。
更精准:instanceof 运算符
如果想区分普通对象和数组,instanceof就能派上用场。它的用法是“变量 instanceof 构造函数”,相当于问“这个变量是不是某个特定类型的实例”。
还是用盒子举例,普通对象是“普通盒子”,数组是“带排列格的储物盒”,instanceof就是问“这个盒子是不是带排列格的储物盒”。
比如:
- const arr = [1,2,3],arr instanceof Array → true,说明这是数组
- const obj = {name:"小明"},obj instanceof Array → false,说明不是数组
- const date = new Date(),date instanceof Date → true,能准确判断日期类型
不过instanceof也有局限,它只能判断引用类型,没法判断基础类型(比如数字、字符串),而且如果是跨页面的数组,instanceof也会失效,因为不同页面的Array构造函数不一样。
全能型判断:Object.prototype.toString.call()
如果想一次性判断所有类型,包括数组、日期、正则,甚至是跨页面的对象,就需要用到这个全能方法。它相当于给每个盒子贴了专属的类型标签,不管盒子怎么包装,都能准确显示里面的真实类型。
用法是把要判断的变量放到call()里,返回的格式是"[object 真实类型]",我们只要把中间的类型提取出来就行。
比如:
- Object.prototype.toString.call("你好") → "[object String]",判断是字符串
- Object.prototype.toString.call([1,2]) → "[object Array]",判断是数组
- Object.prototype.toString.call(new Date()) → "[object Date]",判断是日期
- Object.prototype.toString.call(null) → "[object Null]",这个是typeof判断不出来的,专门对应空值
这个方法几乎能覆盖所有JS数据类型的判断,是开发中最靠谱的选择,只是写法比前两种稍微复杂一点。
避坑小提醒
很多新手用typeof判断null时,会得到"object",这是JS早期的历史遗留bug,不是真的对象,遇到这种情况单独加if判断就行;另外,判断字符串时不要忘了区分带引号的字符串和数字,比如typeof "123"是string,typeof 123才是number,别搞混。
掌握这几种类型判断方法,再结合实际场景选合适的方式,就能避开大部分JS类型判断的坑,写代码时也会更顺畅。