JavaScript数据类型判断之Object.prototype.toString.call() 的详解

Object.prototype.toString.call() 的详解

Object.prototype.toString.call() 是 JavaScript 中判断数据类型的强大方法。它可以精确区分所有的 JavaScript 内置类型,包括原始类型和对象类型。


语法

javascript 复制代码
Object.prototype.toString.call(value)
  • value 是要检测类型的变量。
  • 返回结果是一个类似 "[object Type]" 的字符串,其中 Type 是该变量的类型名称。

为什么使用它?

  • 准确性 :它可以区分 null 和 undefined,以及各种内置对象(如 Array、Date 等)。
  • 通用性:不依赖环境或原型链,可以用于跨环境的类型判断。

返回值

以下是常见数据类型及其对应的返回值:

数据类型 返回值
Number [object Number]
String [object String]
Boolean [object Boolean]
Undefined [object Undefined]
Null [object Null]
Array [object Array]
Object [object Object]
Function [object Function]
Date [object Date]
RegExp [object RegExp]
Error [object Error]
Symbol [object Symbol]
Map [object Map]
Set [object Set]
WeakMap [object WeakMap]
WeakSet [object WeakSet]
BigInt [object BigInt]
自定义类实例 [object Object]

示例

javascript 复制代码
// 基本类型
console.log(Object.prototype.toString.call(123)); // [object Number]
console.log(Object.prototype.toString.call("hello")); // [object String]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(null)); // [object Null]

// 对象类型
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(function() {})); // [object Function]
console.log(Object.prototype.toString.call(new Date())); // [object Date]
console.log(Object.prototype.toString.call(/abc/)); // [object RegExp]

// 特殊对象
console.log(Object.prototype.toString.call(new Map())); // [object Map]
console.log(Object.prototype.toString.call(new Set())); // [object Set]
console.log(Object.prototype.toString.call(Symbol())); // [object Symbol]
console.log(Object.prototype.toString.call(BigInt(123))); // [object BigInt]

适用场景

  1. 区分 null 和 object:

    javascript 复制代码
    console.log(typeof null); // "object" (误导性结果)
    console.log(Object.prototype.toString.call(null)); // [object Null]
  2. 区分对象类型:

    javascript 复制代码
    console.log(Object.prototype.toString.call([])); // [object Array]
    console.log(Object.prototype.toString.call({})); // [object Object]
  3. 跨环境检测 :

    在不同的 JavaScript 环境中(如浏览器和 Node.js),使用 instanceof 有时可能会失败,而 Object.prototype.toString.call() 是可靠的。


封装为通用函数

可以封装为一个类型检测工具:

javascript 复制代码
function getType(value) {
  return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}

console.log(getType(123)); // "number"
console.log(getType(null)); // "null"
console.log(getType([])); // "array"
console.log(getType(new Map())); // "map"
console.log(getType(() => {})); // "function"

注意事项

  • 自定义类实例(非内置对象)都会返回 [object Object],如果需要区分,可以结合 constructor.name:

    javascript 复制代码
    class MyClass {}
    const instance = new MyClass();
    console.log(Object.prototype.toString.call(instance)); // [object Object]
    console.log(instance.constructor.name); // MyClass
  • 无法检测用户定义的 Symbol.toStringTag 修改:

    javascript 复制代码
    const obj = { [Symbol.toStringTag]: "CustomTag" };
    console.log(Object.prototype.toString.call(obj)); // [object CustomTag]

Object.prototype.toString.call() 是一种强大的数据类型判断方法,特别适用于复杂类型判断。

相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端