惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
V
V2EX
博客园 - 【当耐特】
Vercel News
Vercel News
雷峰网
雷峰网
爱范儿
爱范儿
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
NISL@THU
NISL@THU
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
P
Proofpoint News Feed
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
I
InfoQ
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 最新话题
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
V
Visual Studio Blog
AI
AI
Schneier on Security
Schneier on Security
B
Blog RSS Feed
T
Tor Project blog
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cyber Attacks, Cyber Crime and Cyber Security
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
Webroot Blog
Webroot Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main

JavaScript

发现国内很多文章对宏任务和微任务的解释都是有问题的 - V2EX 智能香氛机小程序外包合作招募 - V2EX 分享一道 Node.js 的面试题,考察 JS 相关的最基本的掌握程度,代码完全来自官方文档 你们 js 用过双等号吗 - V2EX 有人大量建立技术文档的.cn 中文站点,并将站内 js 链接指向 cdn.jsdelivr.net.cn - V2EX 发现了两个关于 JavaScript 语言好玩的网站,让人血压升高 简单的图像算法为什么 AI 搞不定呢 Capacitor.JS 如何自动化最后一步流程 JSON.parse 转数字精度丢失问题 有没有前端大佬,帮我看一下这个网站底部的粒子动画怎么做的。 - V2EX 这段前端代码存在并发读取竞态的问题吗? nstr - number → string, but looks good 前端 js 播放 base64 编码的 mp3,放出来杂音很大,请教是哪里出错了? 熟悉工业计算的来,是阀门相关的企业 js 不使用 promise 完成一个 sleep 函数,必须支持 await 调用 - V2EX 小米手机澎湃系统 AutoJS 的悬浮窗在证券软件打开时就消失 - V2EX 关于 js 复制粘贴问题 求助,无法在 wixsite.com 上使用 document.write threejs 官方文档看着好难受。 - V2EX 有没有 AI 能一步一步教会伸手党如何使用业务系统? 也聊下自己最近用 copilot 写程序的心得,还要讨教下方案 javascript 继续 套壳 AI 应用类 manus 如何在移动端 h5 页面实现<Select/>搜索下拉选择框! - V2EX 求前端高频数据绘图库 - V2EX 吐槽一下 Trae 记忆中好像在论坛看到有款专门在 iframe 中做前端的 js 库/框架? - V2EX JavaScript 中的 Promise 跟异步有关系吗?还是我的理解有问题?谁能把 Promise 解释清楚? Promise 的正确用法应该是什么样的? - V2EX 求问,小程序的菜单栏怎么和右边的功能键垂直居中? - V2EX 自习室小程序的座位图是如何实现的(前端) - V2EX 谷歌浏览器的 bug - V2EX 为什么中小公司的前端面试官爱问 array 和 object 有多少种方法 - V2EX 有什么办法能实现 uniapp 上的离线人脸识别 本人遇到了非常奇怪的关于“注释”ctrl+/ 快捷键问题,需要大佬们指点一二。 ChatGPT 语音对话技术 求前端大佬解惑, HTML 里的文本怎么做逐行滚动? 快应用问题求助 2024 JS 生态调查结果出炉: React 遥遥领先, Vue 程序员最穷 不顾“万人联名请愿”,甲骨文拒绝放弃 JavaScript 商标所有权 2025 年,我又把前端"老古董"--AMD 给翻了出来 有使用 javascript 编写 windows cmd 批处理程序的方法吗,类似 coffescript 这样转译的东西 js 小白,请教一下为什么网页上的播放器, Chrome 控制台不能用 querySelector 直接获取到呢 自荐一个 js 通信的包 Python 代码转换为 Javascript 运算结果不一致 css 的 justify-content 等效语法? 请教一下使用油猴脚本修改 html 内容后, 样式不生效的问题 async 函数中止/task local 方案后记,V8 上的另一个可行思路 如何在前端统计用户观看视频所消耗的流量?求教啊,大神们! pdfjs 中,通过 findController 可以搜索到对应的文本信息,并且高亮出来。那么, pdfjs 有没有什么 api 可以获取搜索到的信息的位置节点 ?请教 有没有独立的同时可以 pc 移动端用的三级联动城市选择组件啊 - V2EX 字幕滚动有没有更好的方式实现
js 判空值 最佳实践 - V2EX
mqnu00 · 2025-11-06 · via JavaScript

这是一个创建于 220 天前的主题,其中的信息可能已经有所发展或是发生改变。

变量 a

我通常是

if (a) {...}

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

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

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

第 1 条附言  ·  2025 年 11 月 7 日

总结一下大家的内容

Js 判空应结合业务场景


在大多数场景下,仅考虑值为 nullundefined 判空时,可以使用以下方式:

  • if (a != null) { ... } // #2
  • if (!a ?? true) { ... } // #9
  • 或使用 lodash isNil

而在更复杂的场景中,如果还希望将以下值也视为“空”:

  • [](空数组)
  • {}(空对象)
  • NaN
  • ''(空字符串)
  • 等等

则需要更广义的判空逻辑。复杂之处在于:

  • 对于数组和对象,=== 是引用比较,无法判断结构是否为空。
  • 多种情况不能统一用一种方法处理,要写很多if...else...

因此,大家更倾向于使用公认的封装函数,比如 lodash isEmpty,而不是自己封装。


第 2 条附言  ·  2025 年 11 月 7 日

基于#51的提醒,附言1提到的

if (!a ?? true) {...}

实际指的是

if(!(a ?? true)) {...}

但是无法只判断null或undefined为空。

liuwk

1

liuwk      2025 年 11 月 6 日   ❤️ 1

[null,undefined,'',false].includes(a) 我都这样写的

USDT

2

USDT      2025 年 11 月 6 日   ❤️ 6

if (a != null) {
// a is not null or undefined
}

没想到吧,==这种邪教在这里居然有用😏

toy007

3

toy007      2025 年 11 月 6 日

第二种漏了: 空字符串 '', 非数字 NaN

toy007

5

toy007      2025 年 11 月 6 日

sorry 好像是我搞反了

craftsmanship

6

craftsmanship      2025 年 11 月 6 日 via Android

2 楼正解 最简洁的形式 但对 JS 各种怪癖不熟悉的人来说可读性很差

shintendo

7

shintendo      2025 年 11 月 6 日

if (a || a === 0)

zsc8917zsc

8

zsc8917zsc      2025 年 11 月 6 日

@USDT #2 ==挺好的还能对比 1 和'1' ,魔功自古讲究一个简单粗暴好用

marcong95

13

marcong95      2025 年 11 月 6 日

当时我刚开始用 Standard JS 代码规范的时候,就看到了关于等号的用法里面就学会了用 == 判空这种魔幻用法

Always use === instead of ==.
Exception: obj == null is allowed to check for null || undefined.

hronro

14

hronro      2025 年 11 月 6 日

@FakerLeung 门禁是指 ESLint 之类的?我记得 ESLint 对 == 的使用,是可以配置成只允许 == null 的

han3sui

15

han3sui      2025 年 11 月 6 日   ❤️ 1

直接 lodash-es isEmpty()

jsq2627

16

jsq2627      2025 年 11 月 6 日   ❤️ 6

别封装,对于阅读代码的人,看到 isEmpty 并不知道内部实现是怎样的,对 0 / NaN / '' 是怎么处理的,还要点进去看,很麻烦

就用 if (a !== null && a !== undefined) {...} 一目了然,不管是熟手还是新手都知道在干什么。

Ulduar

17

Ulduar      2025 年 11 月 6 日

这种问题 AI 最强大

shakaraka

18

shakaraka      2025 年 11 月 6 日

接口层用 zod 保证入参,在业务中用 ts 保证业务类型。少封装这种。不然一会给你个正常的空值你拿来当 else ,除了问题你都不知道是哪里出的

tyrone2333

19

tyrone2333      2025 年 11 月 6 日   ❤️ 1

?? 和 ?. 了解一下

NerbraskaGuy

20

NerbraskaGuy      2025 年 11 月 6 日   ❤️ 1

用!!吧,虽然可读性很差,追求可读性的话就是枚举一遍了

leegradyllljjjj

21

leegradyllljjjj      2025 年 11 月 6 日 via iPhone

我都是在同项目翻其他文件看别人代码是怎么写的,直接靠屁过来,到时候翻车了直接推锅

huiyuanai709

22

huiyuanai709      2025 年 11 月 6 日

首先加上 typeof a == 'undefined'

mizuki9

24

mizuki9      2025 年 11 月 6 日

const NoneSymbol = Symbol("none");

const isNone = (val: unknown): val is null | undefined => {
return (val ?? NoneSymbol) === NoneSymbol;
};

yhxx

25

yhxx      2025 年 11 月 6 日

抄一下 lodash.isempty 就行了,有现成的

Ketteiron

26

Ketteiron      2025 年 11 月 6 日   ❤️ 1

我的建议是别用 js 了,换 ts ,0 false undefined null '' [] {} 没有任何歧义
甚至就算写 js 也可以用 ts 规则检查,人脑的静态检查永远比不过语言类型

jsq2627

27

jsq2627      2025 年 11 月 6 日   ❤️ 1

我补充一下我上面 #16 的回复,这种要不就别封装,要不就直接用 lodash 这种大家都熟悉的库,至少文档清晰,有 bug 一般也不会怀疑它的内部实现。

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

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

netnr

28

netnr      2025 年 11 月 6 日

C# 味

isNullOrWhiteSpace: (value) => value == null || value.toString().trim() == "",

zogwosh

29

zogwosh      2025 年 11 月 6 日

只有一个最佳实践,额外封装一个 isEmpty 给自己用,把需要判空的 case 加入判断,即便项目内已经存在了其他同事封装的相同方法,安装了 lodash 。
不要考虑其他同事的阅读性,因为事实就是没有人有动力去用不熟悉的代码的封装,除非必须或有大手推动。

mqnu00

30

mqnu00      2025 年 11 月 6 日

@Ketteiron js 我目前是用 jsdoc ,你说的 “就算写 js 也可以用 ts 规则检查” 是指这个吗

Xheldon

31

Xheldon      2025 年 11 月 6 日

只有少数几个人答对了,用 `??`

xuejianxianzun

32

xuejianxianzun      2025 年 11 月 6 日

空值合并运算符 `??` 是一个逻辑运算符,当左侧的操作数为 `null` 或者 `undefined` 时,返回其右侧操作数,否则返回左侧操作数。

Ketteiron

33

Ketteiron      2025 年 11 月 6 日   ❤️ 1

@mqnu00 js doc 只能定义静态的简单类型,它没法判断一个变量经过某个逻辑判断后变成了什么模样。
例如一个参数可以同时是值、数组或函数,这很常见,ts 中如果你用 if(typeof 判断出是什么具体类型,数组分支里点号按一下数组的可用函数列表就出来了,函数分支里才能(),逻辑越复杂代码越长,ts 对可读性的帮助越大。
ts 开启 checkJs 后会尽力检查 js 文件每一行代码在上下文里是否正确的,不过帮助有限,如果写上 js doc 就可以更精确地检查类型,再加上 typescript-eslint ,像某个角落漏了 await 也能查出来。

l864494871

34

l864494871      2025 年 11 月 6 日 via iPhone

判断 null 用==即可

Valid

35

Valid      2025 年 11 月 6 日

数字 0 在哪里都不是 empty 啊

Valid

36

Valid      2025 年 11 月 6 日

!'' !NaN !null !undefined 都是 true ,所以!a 够用了,除非 a 是[]or{}

zhlssg

37

zhlssg      2025 年 11 月 6 日

无脑选 _.isNil

rekulas

38

rekulas      2025 年 11 月 6 日

一般用!!val 就够了,大部分情况都有效,也不像其他语法糖挑版本

okakuyang

39

okakuyang      2025 年 11 月 6 日

两个感叹号用了几年,从来没考虑过有没有异常情况,看上面这么多回复感觉有点奇怪了。

faimin

40

faimin      2025 年 11 月 7 日

@USDT 哈哈,我也是一直这么判空的

ragnaroks

41

ragnaroks      2025 年 11 月 7 日

不嫌麻烦的话 zod 是最优解

94

42

94      2025 年 11 月 7 日   ❤️ 1

其实相关业务就会很明确输入的内容会是什么东西,同样的你可能还需要判断:

- 是否是 '';
- 是否是 NaN;
- 是否是 [];
- 是否是 {}。

这些情况下都没有很好的方法直接判断,比如说上面提到的 `lodash.isNil()`,`??`。特别是值是 NaN 的时候基本上都会失效。

所以其实按照实际业务情况做判断就好了,先判断是不是需求的值类型,然后判断是不是为对应的空值。
除非说没办法保证输入的数值类型。但是大部分输入输出都是有预期设计好的类型。

wangtian2020

43

wangtian2020      2025 年 11 月 7 日

出现 null 就把后端骂一顿,然后你就只需要判断 undefined 了

weixiangzhe

44

weixiangzhe      2025 年 11 月 7 日 via Android

isNil 和 ?? optional chaining 呀
!! 空符串和 0 啥的真的会教做人吧

shunia

45

shunia      2025 年 11 月 7 日

判空通常来说就是判空值,在 JS 里也就是 null 和 undefined ,其他所有的判断都是业务需求,并不属于判空。因为 0 也好,NaN 也好,都是有值的。

0xsui

46

0xsui      2025 年 11 月 7 日

_.isNil(null); // true
_.isNil(undefined); // true
_.isNil(''); // false (空字符串不是 nil )
_.isNil(0); // false ( 0 不是 nil )
_.isNil([]); // false (空数组不是 nil )
_.isNil({}); // false (空对象不是 nil )

// 实际场景:接口返回字段判空
const user = { name: '张三', age: undefined, address: null };
if (_.isNil(user.age)) { /* 处理 age 为空的逻辑 */ }
if (_.isNil(user.address)) { /* 处理 address 为空的逻辑 */ }

strickczq

47

strickczq      2025 年 11 月 7 日

apps.apple.com 泄露出来的代码刚好有这方面的:

shared/utils/src/optional.ts

```typescript
export type Optional<T> = T | None;
export type None = null | undefined;

/**
* Determine if an optional value is present.
*
* @param optional value
* @return true if present, false otherwise
*/
export function isSome<T>(optional: Optional<T>): optional is T {
return optional !== null && optional !== undefined;
}

/**
* Determine if an optional value is not present.
*
* @param optional value
* @return true if not present, false otherwise
*/
export function isNone<T>(optional: Optional<T>): optional is None {
return optional === null || optional === undefined;
}
```

可以参考参考

strickczq

48

strickczq      2025 年 11 月 7 日

判断 null 和 undefined 的函数,比起 isEmpty/isNil/isNone ,我更倾向于叫它 isNullish 。
毕竟 MDN 里 `??` 叫做 `nullish coalescing operator`

momocraft

52

momocraft      2025 年 11 月 7 日

不如不要写取值范围这么广的变量

mqnu00

53

mqnu00      2025 年 11 月 7 日

@shintendo 感谢提醒。?? 可以归类 null 和 undefined ,对于其他类型是返回原值,接下来通过 ! 实际还是走了转 bool 的操作,那就又回到 if(0)这种类似的情况了。

xmdbb

54

xmdbb      2025 年 11 月 7 日

我记得早期 N 年前,直接判断 a===undefined 会报错,好像是 IE 还是什么,太久忘记了,所以养成了习惯都写 typeof a === undefined

AtlantaANiu

55

AtlantaANiu      2025 年 11 月 7 日

@shintendo

你说的对,欠考虑了。无论如何右边必须是一个能标识出 null 和 void 0 的唯一值

比如:
const _nil = Symbol('nil')
(a??_nil) === _nil

但这已经不够简洁了。

cheng6563

57

cheng6563      2025 年 11 月 7 日

就算是 js ,也不会往一个字段里一会放 number 一会放 string 吧

shintendo

58

shintendo      2025 年 11 月 7 日

@AtlantaANiu 如果这种形式的话,也不用 Symbol ,(a ?? null) === null 就行了,但这样相当于??只用来处理 undefined 一个值,可读性牺牲有点大

shintendo

59

shintendo      2025 年 11 月 7 日

@xmdbb 你说的情况是变量 a 未定义,直接取值就会报错,需要 typeof a
不用 N 年前也不用 IE ,现在打开 chrome 控制台执行 a===undefined 也是报错的

AV1

60

AV1      2025 年 11 月 7 日

用 ts ,避免同一个变量承受太多样的类型,就没那么多烦恼。

比如一个类型是 value: {...} | undefined ,那我直接 if(value)就够了,根本就没必要担心遗漏 0 、false 、''。

LandCruiser

61

LandCruiser      2025 年 11 月 7 日   ❤️ 1

if ( a )够用了,因为这个值是什么类型,什么值,你心里是有数的,如果 a 需要是 0 才继续执行,那你应该 if ( a===0 ),如果这个值既有可能是其他值,又有可能是 0 ,还需要判断这个值是否存在,那这样的代码就是有问题的,要么前端代码有问题,要么服务端设计的返回值有问题。

cvooc

62

cvooc      2025 年 11 月 7 日

@cheng6563 有的, 兄弟有的.有相当一部分二椅子组件库的 input 组件做到了,绑定的 value 原本是 number(如后台 get 接口返回的格式化数据是 number)组件内部处理成 string,最终修改后的值是 string(提交到后台 save 接口的格式).当然大多数场景对这个不敏感就是了,全是后端框架转对象时自动序列化的.

myderr

63

myderr      2025 年 11 月 7 日

if (a) {...}
因为我知道 a 这会儿不可能是 0

lwfre

64

lwfre      2025 年 11 月 7 日

一致在用 x!=null 来判断。但是刚刚就发现一个错误,有一行代码多写了一个等号,写成了 if (x!==null) 导致一个按钮没显示出来

xuejianxianzun

66

xuejianxianzun      2025 年 11 月 8 日

@shintendo 对于楼主这样只判断 a 有值的情况 `if(a)`,当然可以使用 `??` 操作符,例如 `if (a ?? true)`。准确(只考虑 null 和 undefined ),不用包装。例如:
```
a = undefined
function func () {
if (a ?? true) {
console.log('a is undefined || null')
} else {
console.log('22222222')
}
}
func()
```

xuejianxianzun

67

xuejianxianzun      2025 年 11 月 8 日

上面的写法有问题,我以前也没试过(很少遇到需要同时判断 undefined 和 null 的情况),想当然了。
虽然当 a 为 falsy 时可以准确判断 a 是不是 undefined 或 null ,但是 a 为 truth 时就直接判断 a 为真了,导致总会执行第一条语句。

xuejianxianzun

68

xuejianxianzun      2025 年 11 月 8 日

不过我问 AI 的时候它告诉了我一个之前不知道的知识:
`a == null` 可以判断 a 为 null 或 undefined 的情况,并且当 a 为其他 falsy 时不会误判。
特殊规则:如果一个操作数是 null ,另一个是 undefined ,则直接返回 true 。这是语言设计者有意为之的“快捷路径”,目的是让 null 和 undefined 在语义上被视为“缺失值”( absence of value ),便于统一处理。

xuejianxianzun

69

xuejianxianzun      2025 年 11 月 8 日

如果 linter 允许使用 == 符号的话,可以使用 `if (a == null)` 或者 `if (a == undefined)` 来判断,这两个条件是等价的。不过这有点“冷知识”:使用 null 或 undefined 进行 == 比较的话,只有当 a 为 null 或 undefined 才会返回 true 。

shintendo

70

shintendo      2025 年 11 月 8 日

@xuejianxianzun
这个不算冷的,ESLint 关于===的规则("eqeqeq")里,有个选项开关就是允许==null 。

此外早年流行的几个 JS 代码规范,StandardJS, Airbnb, Google Style Guide, 全都是“禁止使用==,但==null 例外”,算是通行做法。