


















这是一个创建于 220 天前的主题,其中的信息可能已经有所发展或是发生改变。
变量 a
我通常是
if (a) {...}
但是会遇到数字 0 的情况,那就是
if (a !== null && a !== undefined) {...}
然后想着是不是要封装一个isEmpty函数
请问需要封装吗?
第 1 条附言 · 2025 年 11 月 7 日
总结一下大家的内容
Js 判空应结合业务场景
在大多数场景下,仅考虑值为 null 或 undefined 判空时,可以使用以下方式:
if (a != null) { ... } // #2if (!a ?? true) { ... } // #9lodash isNil而在更复杂的场景中,如果还希望将以下值也视为“空”:
[](空数组){}(空对象)NaN''(空字符串)则需要更广义的判空逻辑。复杂之处在于:
=== 是引用比较,无法判断结构是否为空。因此,大家更倾向于使用公认的封装函数,比如 lodash isEmpty,而不是自己封装。
第 2 条附言 · 2025 年 11 月 7 日
基于#51的提醒,附言1提到的
if (!a ?? true) {...}
实际指的是
if(!(a ?? true)) {...}
但是无法只判断null或undefined为空。
1 liuwk 2025 年 11 月 6 日[null,undefined,'',false].includes(a) 我都这样写的 |
2 USDT 2025 年 11 月 6 日if (a != null) { 没想到吧,==这种邪教在这里居然有用😏 |
3 toy007 2025 年 11 月 6 日第二种漏了: 空字符串 '', 非数字 NaN |
5 toy007 2025 年 11 月 6 日 |
6 craftsmanship 2025 年 11 月 6 日 via Android2 楼正解 最简洁的形式 但对 JS 各种怪癖不熟悉的人来说可读性很差 |
7 shintendo 2025 年 11 月 6 日if (a || a === 0) |
8 zsc8917zsc 2025 年 11 月 6 日@USDT #2 ==挺好的还能对比 1 和'1' ,魔功自古讲究一个简单粗暴好用 |
13 marcong95 2025 年 11 月 6 日当时我刚开始用 Standard JS 代码规范的时候,就看到了关于等号的用法里面就学会了用 == 判空这种魔幻用法 Always use === instead of ==. |
14 hronro 2025 年 11 月 6 日@FakerLeung 门禁是指 ESLint 之类的?我记得 ESLint 对 == 的使用,是可以配置成只允许 == null 的 |
15 han3sui 2025 年 11 月 6 日直接 lodash-es isEmpty() |
16 jsq2627 2025 年 11 月 6 日别封装,对于阅读代码的人,看到 isEmpty 并不知道内部实现是怎样的,对 0 / NaN / '' 是怎么处理的,还要点进去看,很麻烦 就用 if (a !== null && a !== undefined) {...} 一目了然,不管是熟手还是新手都知道在干什么。 |
17 Ulduar 2025 年 11 月 6 日 |
18 shakaraka 2025 年 11 月 6 日接口层用 zod 保证入参,在业务中用 ts 保证业务类型。少封装这种。不然一会给你个正常的空值你拿来当 else ,除了问题你都不知道是哪里出的 |
19 tyrone2333 2025 年 11 月 6 日?? 和 ?. 了解一下 |
20 NerbraskaGuy 2025 年 11 月 6 日用!!吧,虽然可读性很差,追求可读性的话就是枚举一遍了 |
21 leegradyllljjjj 2025 年 11 月 6 日 via iPhone我都是在同项目翻其他文件看别人代码是怎么写的,直接靠屁过来,到时候翻车了直接推锅 |
22 huiyuanai709 2025 年 11 月 6 日首先加上 typeof a == 'undefined' |
24 mizuki9 2025 年 11 月 6 日const NoneSymbol = Symbol("none"); const isNone = (val: unknown): val is null | undefined => { |
25 yhxx 2025 年 11 月 6 日抄一下 lodash.isempty 就行了,有现成的 |
26 Ketteiron 2025 年 11 月 6 日我的建议是别用 js 了,换 ts ,0 false undefined null '' [] {} 没有任何歧义 |
27 jsq2627 2025 年 11 月 6 日我补充一下我上面 #16 的回复,这种要不就别封装,要不就直接用 lodash 这种大家都熟悉的库,至少文档清晰,有 bug 一般也不会怀疑它的内部实现。 下图我节选一个我项目中遇到的情况,封装了一百多个 utils function ,每个都不复杂,实现也很精巧,这些 utils 是一位很有经验的高级程序员写出来的。 但是,每次我阅读业务代码时看到 isNil / isEmpty / isTrue 这种,都会想里面是不是有什么魔法,会浪费很多时间点进去看细节。而且对 AI coding 也很不友好,要到处读文件去看实现,不像 lodash 或者直接 inline 有 well-defined behavior 。 |
28 netnr 2025 年 11 月 6 日C# 味 isNullOrWhiteSpace: (value) => value == null || value.toString().trim() == "", |
29 zogwosh 2025 年 11 月 6 日只有一个最佳实践,额外封装一个 isEmpty 给自己用,把需要判空的 case 加入判断,即便项目内已经存在了其他同事封装的相同方法,安装了 lodash 。 |
31 Xheldon 2025 年 11 月 6 日只有少数几个人答对了,用 `??` |
32 xuejianxianzun 2025 年 11 月 6 日空值合并运算符 `??` 是一个逻辑运算符,当左侧的操作数为 `null` 或者 `undefined` 时,返回其右侧操作数,否则返回左侧操作数。 |
33 Ketteiron 2025 年 11 月 6 日@mqnu00 js doc 只能定义静态的简单类型,它没法判断一个变量经过某个逻辑判断后变成了什么模样。 |
34 l864494871 2025 年 11 月 6 日 via iPhone判断 null 用==即可 |
35 Valid 2025 年 11 月 6 日数字 0 在哪里都不是 empty 啊 |
36 Valid 2025 年 11 月 6 日!'' !NaN !null !undefined 都是 true ,所以!a 够用了,除非 a 是[]or{} |
37 zhlssg 2025 年 11 月 6 日无脑选 _.isNil |
38 rekulas 2025 年 11 月 6 日一般用!!val 就够了,大部分情况都有效,也不像其他语法糖挑版本 |
39 okakuyang 2025 年 11 月 6 日两个感叹号用了几年,从来没考虑过有没有异常情况,看上面这么多回复感觉有点奇怪了。 |
41 ragnaroks 2025 年 11 月 7 日不嫌麻烦的话 zod 是最优解 |
42 94 2025 年 11 月 7 日其实相关业务就会很明确输入的内容会是什么东西,同样的你可能还需要判断: - 是否是 ''; 这些情况下都没有很好的方法直接判断,比如说上面提到的 `lodash.isNil()`,`??`。特别是值是 NaN 的时候基本上都会失效。 所以其实按照实际业务情况做判断就好了,先判断是不是需求的值类型,然后判断是不是为对应的空值。 |
43 wangtian2020 2025 年 11 月 7 日出现 null 就把后端骂一顿,然后你就只需要判断 undefined 了 |
44 weixiangzhe 2025 年 11 月 7 日 via AndroidisNil 和 ?? optional chaining 呀 |
45 shunia 2025 年 11 月 7 日判空通常来说就是判空值,在 JS 里也就是 null 和 undefined ,其他所有的判断都是业务需求,并不属于判空。因为 0 也好,NaN 也好,都是有值的。 |
46 0xsui 2025 年 11 月 7 日_.isNil(null); // true // 实际场景:接口返回字段判空 |
47 strickczq 2025 年 11 月 7 日apps.apple.com 泄露出来的代码刚好有这方面的: shared/utils/src/optional.ts ```typescript /** /** 可以参考参考 |
48 strickczq 2025 年 11 月 7 日判断 null 和 undefined 的函数,比起 isEmpty/isNil/isNone ,我更倾向于叫它 isNullish 。 |
52 momocraft 2025 年 11 月 7 日不如不要写取值范围这么广的变量 |
53 mqnu00 2025 年 11 月 7 日@shintendo 感谢提醒。?? 可以归类 null 和 undefined ,对于其他类型是返回原值,接下来通过 ! 实际还是走了转 bool 的操作,那就又回到 if(0)这种类似的情况了。 |
54 xmdbb 2025 年 11 月 7 日我记得早期 N 年前,直接判断 a===undefined 会报错,好像是 IE 还是什么,太久忘记了,所以养成了习惯都写 typeof a === undefined |
55 AtlantaANiu 2025 年 11 月 7 日你说的对,欠考虑了。无论如何右边必须是一个能标识出 null 和 void 0 的唯一值 比如: 但这已经不够简洁了。 |
57 cheng6563 2025 年 11 月 7 日就算是 js ,也不会往一个字段里一会放 number 一会放 string 吧 |
58 shintendo 2025 年 11 月 7 日@AtlantaANiu 如果这种形式的话,也不用 Symbol ,(a ?? null) === null 就行了,但这样相当于??只用来处理 undefined 一个值,可读性牺牲有点大 |
59 shintendo 2025 年 11 月 7 日@xmdbb 你说的情况是变量 a 未定义,直接取值就会报错,需要 typeof a |
60 AV1 2025 年 11 月 7 日用 ts ,避免同一个变量承受太多样的类型,就没那么多烦恼。 比如一个类型是 value: {...} | undefined ,那我直接 if(value)就够了,根本就没必要担心遗漏 0 、false 、''。 |
61 LandCruiser 2025 年 11 月 7 日if ( a )够用了,因为这个值是什么类型,什么值,你心里是有数的,如果 a 需要是 0 才继续执行,那你应该 if ( a===0 ),如果这个值既有可能是其他值,又有可能是 0 ,还需要判断这个值是否存在,那这样的代码就是有问题的,要么前端代码有问题,要么服务端设计的返回值有问题。 |
62 cvooc 2025 年 11 月 7 日@cheng6563 有的, 兄弟有的.有相当一部分二椅子组件库的 input 组件做到了,绑定的 value 原本是 number(如后台 get 接口返回的格式化数据是 number)组件内部处理成 string,最终修改后的值是 string(提交到后台 save 接口的格式).当然大多数场景对这个不敏感就是了,全是后端框架转对象时自动序列化的. |
63 myderr 2025 年 11 月 7 日if (a) {...} |
64 lwfre 2025 年 11 月 7 日一致在用 x!=null 来判断。但是刚刚就发现一个错误,有一行代码多写了一个等号,写成了 if (x!==null) 导致一个按钮没显示出来 |
66 xuejianxianzun 2025 年 11 月 8 日@shintendo 对于楼主这样只判断 a 有值的情况 `if(a)`,当然可以使用 `??` 操作符,例如 `if (a ?? true)`。准确(只考虑 null 和 undefined ),不用包装。例如: |
67 xuejianxianzun 2025 年 11 月 8 日上面的写法有问题,我以前也没试过(很少遇到需要同时判断 undefined 和 null 的情况),想当然了。 |
68 xuejianxianzun 2025 年 11 月 8 日不过我问 AI 的时候它告诉了我一个之前不知道的知识: |
69 xuejianxianzun 2025 年 11 月 8 日如果 linter 允许使用 == 符号的话,可以使用 `if (a == null)` 或者 `if (a == undefined)` 来判断,这两个条件是等价的。不过这有点“冷知识”:使用 null 或 undefined 进行 == 比较的话,只有当 a 为 null 或 undefined 才会返回 true 。 |
70 shintendo 2025 年 11 月 8 日@xuejianxianzun 此外早年流行的几个 JS 代码规范,StandardJS, Airbnb, Google Style Guide, 全都是“禁止使用==,但==null 例外”,算是通行做法。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。