上一篇讲的是var、let、const三种变量声明方式,在讲到变量提升、未初始化变量时,有一个问题——如何判断变量的数据类型?比如“var声明的变量提升后值为undefined,怎么快速判断它的类型?”
这篇就来说说数据类型判断操作符——typeof。typeof是JS中最基础、最常用的类型判断工具,吃透它的用法、返回值规律和使用技巧,才能精准判断数据类型。
阅读收获:掌握typeof操作符的核心用法,熟记它的返回值规律,避开常见判断陷阱,能运用typeof精准判断各类原始数据类型,了解它的局限性及替代方案,为后续学习复杂数据类型判断打下基础。
1. 什么是typeof操作符?
typeof操作符是JS自带的“类型检测工具”,它的作用很简单——判断一个值/变量的数据类型,并返回一个表示类型名称的字符串。 需要注意的是,它的返回值始终是字符串。
可以把typeof理解成物品检测机器,把物品放进去,它会告诉你这是什么东西,比如放入数字6,它会返回"number"。
typeof有两种常见的写法,可以根据需要选择。
// 写法1:typeof 变量、值(推荐使用,简单直观)
let num = 6;
console.log(typeof num);// 输出: "number",字符串类型的返回值
// 写法2: typeof(变量/值),适合复杂表达式
let str = "橘朵";
console.log(typeof(str); //输出: "string"
2. typeof所有返回值
ECMAScript有7种简单数据类型:Undefined、Null、Boolean、Number、BigInt、String和Symbol。
还有一种复杂的引用数据类型叫Object(对象),一组属性和方法的集合。对象的子类包括:Function、Array, Date, RegExp, Map, Set等。
ECMAScript中不能定义自己的数据类型,所有值都可以用这7种数据类型之一来表示。
typeof操作符是用来检测任意变量的数据类型的一元运算符。它的返回值有固定规律,不同的数据类型对应不同的返回值,除了两个特殊情况(null、数组)。
| 数据类型 | typeof返回值 | 含义 | 示例 |
|---|---|---|---|
| Undefined | "undefined" | 未定义 | console.log(typeof undefined); |
| Null | "object" | 空对象(特殊情况) | console.log(typeof null); |
| Boolean | "boolean" | 布尔值 | console.log(typeof true); |
| Number | "number" | 数字 | console.log(typeof 42);,console.log(typeof NaN); |
| BigInt | "bigint" | 任意精度整数 | console.log(typeof 9007199254740991n); |
| String | "string" | 字符串 | console.log(typeof "hello"); |
| Symbol | "symbol" | 符号 | console.log(typeof Symbol()); |
| Function | "function" | 函数 | console.log(typeof function() {});, console.log(typeof class C {}); |
| 其他对象 | "object" | Object、Array, Date, RegExp, Map, Set等 | console.log(typeof {});,console.log(typeof new Date());,console.log(typeof [1,2,3]); |
重点总结:typeof返回值一共有7种:"boolean"、"string"、"number"、"bigint"、"symbol"、"function"、"object"。其中有3种特殊情况:
-
检测
null返回"object",这是JS的历史遗留bug,不是真的对象。 -
检测数组返回
"object",但无法区分数组和普通对象。 -
检测函数返回
"function",typeof单独给它分配了返回值。
3. typeof的使用场景
typeof的使用场景很广泛,下面讲4种最常见的场景。
2.1 判断变量是否未初始化
let、const声明的变量未初始化时,访问会报错。var声明的变量未初始化时,值为undefined。用typeof可以安全地判断变量是否未初始化,避免报错。
//var声明,未初始化,值为undefined
var uninitVar;
console.log(typeof uninitVar);// 输出"undefined"
//let声明,未初始化,直接访问报错,用typeof判断安全
let uninitLet;
console.log(uninitLet); //cannot access 'uninitLet' before initialization
console.log(typeof uninitLet); //输出"undefined"
//变量未声明,直接访问报错,用typeof判断安全
// console.log(noDeclare); // 报错:noDeclare is not defined
console.log(typeof noDeclare); // 输出:"undefined"
typeof检测未声明的变量,不会报错,而是返回undefined,这是它的优势,可以安全的判断某个变量是否存在。
2.2 判断变量类型是否符合预期
在实际开发中,经常要判断变量类型是否符合需求。比如期望是数字,但实际是字符串,用typeof可以快速校验。
// 判断变量是否为数字,避免计算错误
Function add(a, b) {
// 用typeof 判断a 和 b 是否为数字,不是则提示错误
if(typeof a !=="number" || typeof b !== "number") {
console.log("传入的承诺书必须是数字!");
return;
}
return a + b;
}
console.log(add(10, 20)); // 输出:30(正常计算)
console.log(add(10, "20")); // 输出:错误:传入的参数必须是数字!(避免错误计算)
2.3 区分 undefined 和 null
undefined 和 null都表示“空”,但含义不一样。
undefined表示变量已声明但未赋值,或函数无返回值。null表示一个明确的空值,通常由开发人员主动赋值。
let u = undefined;
let n = null;
// typeof判断
console.log(typeof u); // 输出"undefined"
console.log(typeof n); // 输出"object"
//正确区分方式1: ===严格相等(优先使用)
console.log(u === undefined); // 输出 true
console.log( n === null); // 输出 true
console.log(u === null); // 输出false
//正确区分方式2:typeof操作符
consoel.log(typeof u === 'undefined');//输出true
console.log(typeof n ==="object" && n === null); // 输出true
2.4 判断函数是否存在
开发中,有时候要调用不确定是不是存在的函数,用typeof可以判断函数是否存在。
// 判断函数是否存在,存在则调用
if(typeof func === "function") {
func(); // 函数存在时执行
} else {
console.log("函数不存在!");
}
4. typeof 的局限性
-
历史遗留问题:
typeof null返回"object"。这是因为在 JavaScript 早期实现中,用于标识类型的标签和对象相同。如果需要准确判断null,使用value === null。 -
无法区分对象子类型: 对于普通对象、数组、日期或正则表达式,
typeof统一返回"object"。
console.log(typeof new Date());// 输出 "object"
console.log(typeof /^123$/); //输出 ”object“
console.log(typeof {}); // 输出 "object"
区分它们,要借助更专业的方法:
- 判断数组:使用
Array.isArray(value) - 判断其他内置对象:使用
Object.prototype.toString.call(value),它会返回如[object Array]、[object Date]等更精确的字符串。
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call(new Date())); // "[object Date]"
5. 总结
typeof是JS的类型检测工具,返回值始终是字符串,能快速判断不多数原始数据类型,但有一定的局限性。
核心要点:
typeof的作用:判断变量/值的数据类型,返回值是表示类型的字符串;- 3种特殊情况:
null返回"object",数组返回"object",函数返回"function"; - 常用场景:判断变量是否未初始化,校验变量类型,区分
undefined和null,判断函数是否存在; - 局限性:
typeof null返回"object",无法区分对象子类型。
下一篇,讲的是JS的数据类型——undefined类型。