JS中使用typeof判断数据类型时如何区分null与真实对象
问题本质
typeof null === 'object' 是JavaScript设计初期遗留的历史问题,由于修复该行为会破坏大量存量线上代码,该特性一直保留至今,因此无法直接通过typeof操作符区分null值与普通对象。
可落地的解决方案
方案1:前置null值严格校验
这是性能最好、逻辑最直白的方案,先通过严格相等运算符排除null场景,再执行对象类型判断即可:const apiRes = [{a: null, b: 'example'}, {a: {c: 'example'}, b: 'example'}] apiRes.forEach(item => { if (item.a === null) { // 处理a为null的逻辑 console.log('当前项a字段值为null') } else if (typeof item.a === 'object') { // 处理a为真实对象的逻辑 console.log('当前项a字段为对象,值为:', item.a) } })注意:必须使用严格相等
===做判断,不要用非严格相等==,否则会把undefined值也误判为null,影响判断准确性。方案2:使用原型toString方法做全类型精准检测
如果业务场景需要统一判断多种数据类型(比如还要区分数组、日期对象、正则等其他typeof会误判为object的类型),可以调用Object.prototype.toString方法获取值的真实类型标签:// 通用精准类型判断工具函数 function getType(val) { return Object.prototype.toString.call(val).slice(8, -1).toLowerCase() } // 检测效果 console.log(getType(null)) // 输出: null console.log(getType({c: 'example'})) // 输出: object console.log(getType([])) // 输出: array console.log(getType(new Date())) // 输出: date该方法不需要做额外的前置判断,覆盖所有JS内置数据类型的检测场景,适合封装为通用工具函数长期使用。
额外注意事项
接口返回的JSON数据中如果存在数组类型值,
typeof检测数组同样会返回'object',如果业务需要区分数组和普通键值对对象,可以在判断为object后追加Array.isArray(待检测值)的校验即可。
内容的提问来源于stack exchange,提问作者Vivek S
相关产品推荐
相关产品推荐

