js如何判空?

在 JavaScript 中,判空(检查变量是否为"空"值)需要针对不同数据类型进行区分。根据你的需求,"空"包括:空数组、空对象、空字符串、0、undefined、null、空 Map、空 Set。

1. 严格判空(仅 null 或 undefined)

javascript 复制代码
if (value == null) { // 等价于 value === null || value === undefined
    console.log("值为 null 或 undefined");
}

2. 宽松判空(包括空字符串、空数组、空对象等)

方法 1:自定义 isEmpty 函数

javascript 复制代码
function isEmpty(value) {
    return (
        value == null || // null 或 undefined
        (typeof value === "string" && value.trim() === "") || // 空字符串或全空格
        (Array.isArray(value) && value.length === 0) || // 空数组
        (typeof value === "object" && Object.keys(value).length === 0) || // 空对象
        (value instanceof Map && value.size === 0) || // 空 Map
        (value instanceof Set && value.size === 0) // 空 Set
        // 注意:0 不算空,除非额外处理
    );
}

// 测试
console.log(isEmpty(null)); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty("")); // true
console.log(isEmpty("   ")); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
console.log(isEmpty(new Map())); // true
console.log(isEmpty(new Set())); // true
console.log(isEmpty(0)); // false(默认不算空,除非修改逻辑)

方法 2:如果 0 也算空

javascript 复制代码
function isEmpty(value) {
    return (
        value == null ||
        (typeof value === "string" && value.trim() === "") ||
        (Array.isArray(value) && value.length === 0) ||
        (typeof value === "object" && Object.keys(value).length === 0) ||
        (value instanceof Map && value.size === 0) ||
        (value instanceof Set && value.size === 0) ||
        value === 0 // 0 也算空
    );
}

console.log(isEmpty(0)); // true

3. 特殊情况处理

(1)0 是否算空?

  • 默认情况下,0 是一个有效的数字,不算空。
  • 如果业务上需要 0 也算空,可以在 isEmpty 里加上 value === 0。

(2)false 是否算空?

  • false 是布尔值,通常不算空,除非特别处理。

(3)NaN 是否算空?

  • NaN 是无效数字,可以额外判断:
javascript 复制代码
Number.isNaN(value)

4. 完整判空方案(推荐)

javascript 复制代码
function isEmpty(value, treatZeroAsEmpty = false) {
    return (
        value == null ||
        (typeof value === "string" && value.trim() === "") ||
        (Array.isArray(value) && value.length === 0) ||
        (typeof value === "object" && Object.keys(value).length === 0) ||
        (value instanceof Map && value.size === 0) ||
        (value instanceof Set && value.size === 0) ||
        (treatZeroAsEmpty && value === 0) // 可选:0 是否算空
    );
}

// 使用
console.log(isEmpty(0)); // false
console.log(isEmpty(0, true)); // true(0 算空)

5. 总结

数据类型 判空方式
null / undefined value == null
空字符串 "" value === "" 或 value.trim() === ""
空数组 \[\] Array.isArray(value) && value.length === 0
空对象 {} Object.keys(value).length === 0
空 Map value instanceof Map && value.size === 0
空 Set value instanceof Set && value.size === 0
0 默认不算空,除非额外处理
false 通常不算空
NaN Number.isNaN(value)

6. 最终推荐

javascript 复制代码
function isEmpty(value, options = { treatZeroAsEmpty: false }) {
    return (
        value == null ||
        (typeof value === "string" && value.trim() === "") ||
        (Array.isArray(value) && value.length === 0) ||
        (typeof value === "object" && Object.keys(value).length === 0) ||
        (value instanceof Map && value.size === 0) ||
        (value instanceof Set && value.size === 0) ||
        (options.treatZeroAsEmpty && value === 0)
    );
}
相关推荐
软件聚导航10 小时前
「聚小软 AI 助手」技术升级:从数据库检索到 RAG 知识库问答
前端·数据库·mysql·微信小程序·小程序·ai编程·rag
恋猫de小郭11 小时前
看懂大模型架构术语,帮助你理解目前常见的大模型开源架构
前端·人工智能·ai编程
yma1611 小时前
通过提示词实现GitHub Pages 和 Nginx 双部署竟然这么简单?
前端
可乐鸡翅yeah_11 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
前端 贾公子11 小时前
第09章:上下文与记忆 (2)
java·服务器·前端
可乐鸡翅yeah_11 小时前
第三方接口对接 M3U8 流媒体排坑实战,解决外部服务商流兼容难题
前端·javascript·python·django·html·m3u8·m3u8在线
GoppViper11 小时前
RDF资源描述框架深度解析:语义Web的数据基石与实战逻辑
前端·数据库
郑州光合科技余经理11 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒11 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
默_笙11 小时前
🏠 「LLM Notes」:我用 Next.js + Redis 给自己造了个笔记博客
前端·javascript