typeof操作符,判断JS数据类型

49 阅读5分钟

上一篇讲的是varletconst三种变量声明方式,在讲到变量提升、未初始化变量时,有一个问题——如何判断变量的数据类型?比如“var声明的变量提升后值为undefined,怎么快速判断它的类型?”

这篇就来说说数据类型判断操作符——typeoftypeof是JS中最基础、最常用的类型判断工具,吃透它的用法、返回值规律和使用技巧,才能精准判断数据类型。

阅读收获:掌握typeof操作符的核心用法,熟记它的返回值规律,避开常见判断陷阱,能运用typeof精准判断各类原始数据类型,了解它的局限性及替代方案,为后续学习复杂数据类型判断打下基础。

1. 什么是typeof操作符?

typeof操作符是JS自带的“类型检测工具”,它的作用很简单——判断一个值/变量的数据类型,并返回一个表示类型名称的字符串。 需要注意的是,它的返回值始终是字符串。

可以把typeof理解成物品检测机器,把物品放进去,它会告诉你这是什么东西,比如放入数字6,它会返回"number"。

typeof有两种常见的写法,可以根据需要选择。

// 写法1:typeof 变量、值(推荐使用,简单直观)
let num = 6console.log(typeof num);// 输出: "number",字符串类型的返回值

// 写法2: typeof(变量/值),适合复杂表达式
let str = "橘朵";
console.logtypeof(str); //输出: "string"

2. typeof所有返回值

ECMAScript有7种简单数据类型:UndefinedNullBooleanNumberBigIntStringSymbol

还有一种复杂的引用数据类型叫Object(对象),一组属性和方法的集合。对象的子类包括:FunctionArray, 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"ObjectArray, Date, RegExp, Map, Setconsole.log(typeof {});,console.log(typeof new Date());,console.log(typeof [1,2,3]);

重点总结:typeof返回值一共有7种:"boolean""string""number""bigint""symbol""function""object"。其中有3种特殊情况:

  1. 检测null 返回"object",这是JS的历史遗留bug,不是真的对象。

  2. 检测数组返回"object",但无法区分数组和普通对象。

  3. 检测函数返回"function",typeof单独给它分配了返回值。

3. typeof的使用场景

typeof的使用场景很广泛,下面讲4种最常见的场景。

2.1 判断变量是否未初始化

letconst声明的变量未初始化时,访问会报错。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 区分 undefinednull

undefinednull都表示“空”,但含义不一样。

  • 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 的局限性

  1. 历史遗留问题: typeof null返回 "object"。这是因为在 JavaScript 早期实现中,用于标识类型的标签和对象相同。如果需要准确判断 null,使用 value === null

  2. 无法区分对象子类型: 对于普通对象、数组、日期或正则表达式,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"
  • 常用场景:判断变量是否未初始化,校验变量类型,区分undefinednull,判断函数是否存在;
  • 局限性:typeof null返回 "object",无法区分对象子类型。

下一篇,讲的是JS的数据类型——undefined类型。