typeof仅适合粗筛,存在null判为object、数组日期等统一返回object、未声明变量与undefined难区分、包装对象误判等问题,应结合object.prototype.tostring.call或专用方法如array.isarray()精准判断。

typeof 是 JavaScript 中最轻量的类型检测手段,但它只适合做“粗筛”,不能当“诊断工具”用。它返回的字符串看似直观,但几个关键误判会让逻辑出错,尤其在处理 null、数组、日期等常见值时。
null 被当成 object
这是 JS 诞生初期的历史包袱:null 的内部表示和对象一样是全零位,导致 typeof null === "object"。这会误导判断,比如写 if (typeof data === "object") 时,data 是 null 也会进入分支,可能引发后续报错。
- 修正方案:先单独检查
data === null,再结合 typeof 判断 - 更稳妥的做法是用
Object.prototype.toString.call(data) === "[object Null]"
所有引用类型都返回 "object"
数组、Date、RegExp、Map、Set、自定义类实例……只要不是函数,typeof 全部返回 "object"。你无法靠它区分 [] 和 {},也无法识别 /abc/ 是正则。
- 数组可用
Array.isArray()直接判断(推荐) - 其他内置类型统一用
Object.prototype.toString.call(value),它返回形如"[object Array]"或"[object Date]"的标准字符串 - 这个方法不受 iframe 或不同全局环境影响,比 instanceof 更可靠
未声明变量与 undefined 变量无法区分
typeof undeclaredVar 和 typeof declaredButUndefined 都返回 "undefined"。你不知道它是根本没定义,还是定义了但没赋值。
- 若需区分,可配合
in操作符或hasOwnProperty(针对对象属性) - 但多数场景下,只需关心“是否为 undefined 值”,这时 typeof 已够用且安全(不会报错)
String/Number/Boolean 对象实例被误判为 object
用 new String("a") 创建的是包装对象,typeof 返回 "object";而字面量 "a" 才返回 "string"。这种不一致容易在跨团队或遗留代码中埋坑。
- 避免使用
new String()、new Number()等构造方式 - 需要强类型校验时,可加一层
value instanceof String辅助判断 - 更通用的做法仍是
Object.prototype.toString.call(value),它对包装对象也返回"[object String]"
不复杂但容易忽略











