用 object.prototype.tostring.call.bind(object.prototype.tostring) 创建 typeof 函数可精准检测内置类型,如 typeof([]) 返回 "[object array]",而 typeof 无法区分数组、正则等,均返回 "object"。

直接用 Object.prototype.toString.call.bind(Object.prototype.toString) 创建一个可复用的类型检测函数,比每次写 Object.prototype.toString.call(obj) 更简洁。
为什么用 call.bind?
Object.prototype.toString 本身不接收参数,必须靠 call 或 apply 绑定目标对象并调用。手动每次都写 .call(obj) 冗余;而 .call.bind(原函数) 能预先固定第一个参数(即要调用的函数),生成一个“等效于 call 但只缺目标对象”的新函数。
注意:这里不是 Function.prototype.call.bind 本身,而是 Object.prototype.toString.call.bind(Object.prototype.toString) —— 后者才是实际可用的类型判断工具。
简化写法示例
传统写法:
Object.prototype.toString.call([]) // "[object Array]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(123) // "[object Number]"
用 bind 简化后:
- 定义一次检测函数:
const typeOf = Object.prototype.toString.call.bind(Object.prototype.toString); - 后续直接传入任意值:
typeOf([])→"[object Array]",typeOf(new Date())→"[object Date]" - 配合
slice提取类型名更实用:const getType = obj => typeOf(obj).slice(8, -1).toLowerCase();,如getType({})返回"object"
和 typeof 的区别在哪?
typeof 对数组、正则、日期等都返回 "object",无法区分;而 Object.prototype.toString 能精确识别内置类型。例如:
-
typeof [] === "object",但typeOf([]) === "[object Array]" -
typeof /a/ === "object",但typeOf(/a/) === "[object RegExp]" -
typeof null === "object"(历史 bug),但typeOf(null) === "[object Null]",明确可辨
注意事项
这个技巧依赖 Object.prototype.toString 的内部行为,对宿主对象(如 DOM 元素)或某些环境(旧版 IE)可能返回不一致结果,生产环境建议搭配 if (obj == null) 或构造器检查做兜底。
现代项目中也可直接用 Array.isArray()、Number.isNaN() 等专用 API,但通用类型字符串提取仍以 toString.call.bind 方式最可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











