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源码中用于区分响应式对象与普通对象)
- 调试时快速识别复杂对象的内部类型
- 避免因
typeof或instanceof的局限性导致的误判
总结:这段代码通过低层级API实现了JavaScript值类型的精准识别,是处理类型判断场景的可靠工具。
本文地址:https://www.tides.cn/p_js-to-raw-type