toRawType

栏目: Javascript 发布时间:2025-10-13
const _toString = Object.prototype.toString

export function toRawType(value: any): string {
  return _toString.call(value).slice(8, -1)
}

这段代码定义了一个工具函数 toRawType,用于精确获取JavaScript值的内部类型标识。以下是逐行解析:

1. 变量定义

const _toString = Object.prototype.toString;
  • 引用原生 Object.prototype.toString 方法,避免被其他代码覆盖(如自定义的 Object.toString 方法)。

2. 函数实现

export function toRawType(value: any): string {
  return _toString.call(value).slice(8, -1);
}
  • _toString.call(value)
    通过 call 绑定上下文为 value,触发内部类型检测。例如:

    • Object.prototype.toString.call([])"[object Array]"
    • Object.prototype.toString.call(123)"[object Number]"
    • Object.prototype.toString.call(null)"[object Null]"
  • .slice(8, -1)
    截取字符串的子串:

    • 索引 8:跳过 "[object " 前缀(共8字符)
    • -1:排除末尾的 "]"
    • 最终得到纯类型名,如 "Array""Number""Null"

3. 核心价值

  • 精准识别原始类型
    相比 typeof(无法区分数组/日期等)和 constructor.name(可被重写),此方法直接读取JS引擎的内部类型标记,结果稳定可靠。

  • 典型输出示例

    输入值 输出结果
    [] "Array"
    {} "Object"
    new Date() "Date"
    /a/ "RegExp"
    null "Null"
    undefined "Undefined"
    Promise.resolve() "Promise"
    class A {} 的实例 "Object"(需注意:ES6类实例默认返回"Object",除非设置Symbol.toStringTag

4. 对比其他类型检测方法

检测方法 数组 日期 正则 Null Undefined Promise 自定义类实例 特殊说明
typeof object object object object undefined object object/function 无法区分具体对象类型;函数返回function
constructor.name Array Date RegExp ❌错误 ❌错误 Promise 自定义类名 依赖constructor存在性;可被重写或删除
Object.prototype.toString Array Date RegExp Null Undefined Promise Object 默认返回[object Object];可通过Symbol.toStringTag自定义

5. 实际场景应用

  • 在框架/库中用于精确判断数据类型(如Vue源码中用于区分响应式对象与普通对象)
  • 调试时快速识别复杂对象的内部类型
  • 避免因 typeofinstanceof 的局限性导致的误判

总结:这段代码通过低层级API实现了JavaScript值类型的精准识别,是处理类型判断场景的可靠工具。

本文地址:https://www.tides.cn/p_js-to-raw-type