知识卡片

借用Object原型的toString判断真实类型

专业/工作 · 411

内容

JavaScript里typeof对区分数组、日期、正则表达式这类对象无能为力,因为它们的typeof结果统统是”object”。但Object.prototype上默认的toString()方法会返回形如”[object Array]“”[object Date]“这样带具体类型标记的字符串,只是几乎所有内置类都重写了各自的toString()来输出更友好的内容,把这个原始行为掩盖了。绕过重写的办法是通过Function.call()把Object.prototype.toString强行以目标对象为this去调用,而不是直接调用对象自己的toString(),这样就能拿到未被覆盖的、真正反映底层类型标记的字符串。这个技巧揭示了一个更普遍的原理:方法调用时this绑定与方法查找是两回事,可以刻意”借用”一个对象身上定义的方法,套用到另一个完全不相关的对象上执行。

参考来源

《JavaScript权威指南(原书第6版)》第6章《对象》