js 判空值 最佳实践

2025 年 11 月 6 日
 mqnu00

变量 a

我通常是

if (a) {...}

但是会遇到数字 0 的情况,那就是

if (a !== null && a !== undefined) {...}

然后想着是不是要封装一个isEmpty函数 请问需要封装吗?

8728 次点击
所在节点    JavaScript
74 条回复
leegradyllljjjj
2025 年 11 月 6 日
我都是在同项目翻其他文件看别人代码是怎么写的,直接靠屁过来,到时候翻车了直接推锅
huiyuanai709
2025 年 11 月 6 日
首先加上 typeof a == 'undefined'
SpiritQAQ
2025 年 11 月 6 日
isNil?
mizuki9
2025 年 11 月 6 日
const NoneSymbol = Symbol("none");

const isNone = (val: unknown): val is null | undefined => {
return (val ?? NoneSymbol) === NoneSymbol;
};
yhxx
2025 年 11 月 6 日
抄一下 lodash.isempty 就行了,有现成的
Ketteiron
2025 年 11 月 6 日
我的建议是别用 js 了,换 ts ,0 false undefined null '' [] {} 没有任何歧义
甚至就算写 js 也可以用 ts 规则检查,人脑的静态检查永远比不过语言类型
jsq2627
2025 年 11 月 6 日
我补充一下我上面 #16 的回复,这种要不就别封装,要不就直接用 lodash 这种大家都熟悉的库,至少文档清晰,有 bug 一般也不会怀疑它的内部实现。

下图我节选一个我项目中遇到的情况,封装了一百多个 utils function ,每个都不复杂,实现也很精巧,这些 utils 是一位很有经验的高级程序员写出来的。

但是,每次我阅读业务代码时看到 isNil / isEmpty / isTrue 这种,都会想里面是不是有什么魔法,会浪费很多时间点进去看细节。而且对 AI coding 也很不友好,要到处读文件去看实现,不像 lodash 或者直接 inline 有 well-defined behavior 。

netnr
2025 年 11 月 6 日
C# 味

isNullOrWhiteSpace: (value) => value == null || value.toString().trim() == "",
zogwosh
2025 年 11 月 6 日
只有一个最佳实践,额外封装一个 isEmpty 给自己用,把需要判空的 case 加入判断,即便项目内已经存在了其他同事封装的相同方法,安装了 lodash 。
不要考虑其他同事的阅读性,因为事实就是没有人有动力去用不熟悉的代码的封装,除非必须或有大手推动。
mqnu00
2025 年 11 月 6 日
@Ketteiron js 我目前是用 jsdoc ,你说的 “就算写 js 也可以用 ts 规则检查” 是指这个吗
Xheldon
2025 年 11 月 6 日
只有少数几个人答对了,用 `??`
xuejianxianzun
2025 年 11 月 6 日
空值合并运算符 `??` 是一个逻辑运算符,当左侧的操作数为 `null` 或者 `undefined` 时,返回其右侧操作数,否则返回左侧操作数。
Ketteiron
2025 年 11 月 6 日
@mqnu00 js doc 只能定义静态的简单类型,它没法判断一个变量经过某个逻辑判断后变成了什么模样。
例如一个参数可以同时是值、数组或函数,这很常见,ts 中如果你用 if(typeof 判断出是什么具体类型,数组分支里点号按一下数组的可用函数列表就出来了,函数分支里才能(),逻辑越复杂代码越长,ts 对可读性的帮助越大。
ts 开启 checkJs 后会尽力检查 js 文件每一行代码在上下文里是否正确的,不过帮助有限,如果写上 js doc 就可以更精确地检查类型,再加上 typescript-eslint ,像某个角落漏了 await 也能查出来。
l864494871
2025 年 11 月 6 日
判断 null 用==即可
Valid
2025 年 11 月 6 日
数字 0 在哪里都不是 empty 啊
Valid
2025 年 11 月 6 日
!'' !NaN !null !undefined 都是 true ,所以!a 够用了,除非 a 是[]or{}
zhlssg
2025 年 11 月 6 日
无脑选 _.isNil
rekulas
2025 年 11 月 6 日
一般用!!val 就够了,大部分情况都有效,也不像其他语法糖挑版本
okakuyang
2025 年 11 月 6 日
两个感叹号用了几年,从来没考虑过有没有异常情况,看上面这么多回复感觉有点奇怪了。
faimin
2025 年 11 月 7 日
@USDT 哈哈,我也是一直这么判空的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1170998

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX