如何让JavaScript空值校验逻辑更简洁清晰?
首先先指出你原有代码的第一个错误:userName === {} 是完全无效的判断,JS 中对象是引用类型对比,两个不同的空对象永远不会全等,这段逻辑永远不会命中空对象的情况。
推荐实现方案
封装一个通用的判空函数即可覆盖你提到的所有场景,同时规避你遇到的两个问题:
function isEmpty(val) { // 匹配null、undefined、空字符串 if (val == null || val === '') return true // 非对象类型直接返回非空 if (typeof val !== 'object') return false // 排除Date、RegExp等内置实例的误判 if (val instanceof Date || val instanceof RegExp || val instanceof Map || val instanceof Set) return false // 普通空对象判断 return Object.keys(val).length === 0 }
调用方式非常简洁:
var userName; console.log(isEmpty(userName) ? "useable" : "unuseable");
你遇到的两个问题的说明
- 直接用
if(userName)隐式判断的问题:它会把数字0、布尔值false、NaN都判定为假值,如果你不需要把这类值判定为空,确实不能直接用这种方式。 Object.keys(obj).length === 0误判内置实例的问题:Date、RegExp这类内置实例本身没有可枚举的自有属性,所以直接判断会被识别为空对象,只要在判断前加内置类型的过滤即可解决。
如果你的业务场景不需要覆盖太多边界,只需要判断你列出的几种情况,也可以直接写条件,不需要封装函数:
var userName; if (userName == null || userName === '' || (typeof userName === 'object' && Object.keys(userName).length === 0 && !(userName instanceof Date))) { console.log("useable"); } else { console.log("unuseable"); }
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

