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