js 判空值 最佳实践

48 天前
 mqnu00

变量 a

我通常是

if (a) {...}

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

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

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

6011 次点击
所在节点    JavaScript
74 条回复
LandCruiser
47 天前
if ( a )够用了,因为这个值是什么类型,什么值,你心里是有数的,如果 a 需要是 0 才继续执行,那你应该 if ( a===0 ),如果这个值既有可能是其他值,又有可能是 0 ,还需要判断这个值是否存在,那这样的代码就是有问题的,要么前端代码有问题,要么服务端设计的返回值有问题。
cvooc
47 天前
@cheng6563 有的, 兄弟有的.有相当一部分二椅子组件库的 input 组件做到了,绑定的 value 原本是 number(如后台 get 接口返回的格式化数据是 number)组件内部处理成 string,最终修改后的值是 string(提交到后台 save 接口的格式).当然大多数场景对这个不敏感就是了,全是后端框架转对象时自动序列化的.
myderr
47 天前
if (a) {...}
因为我知道 a 这会儿不可能是 0
lwfre
47 天前
一致在用 x!=null 来判断。但是刚刚就发现一个错误,有一行代码多写了一个等号,写成了 if (x!==null) 导致一个按钮没显示出来
tog
47 天前
@LandCruiser 这个是正解
xuejianxianzun
46 天前
@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
46 天前
上面的写法有问题,我以前也没试过(很少遇到需要同时判断 undefined 和 null 的情况),想当然了。
虽然当 a 为 falsy 时可以准确判断 a 是不是 undefined 或 null ,但是 a 为 truth 时就直接判断 a 为真了,导致总会执行第一条语句。
xuejianxianzun
46 天前
不过我问 AI 的时候它告诉了我一个之前不知道的知识:
`a == null` 可以判断 a 为 null 或 undefined 的情况,并且当 a 为其他 falsy 时不会误判。
特殊规则:如果一个操作数是 null ,另一个是 undefined ,则直接返回 true 。这是语言设计者有意为之的“快捷路径”,目的是让 null 和 undefined 在语义上被视为“缺失值”( absence of value ),便于统一处理。
xuejianxianzun
46 天前
如果 linter 允许使用 == 符号的话,可以使用 `if (a == null)` 或者 `if (a == undefined)` 来判断,这两个条件是等价的。不过这有点“冷知识”:使用 null 或 undefined 进行 == 比较的话,只有当 a 为 null 或 undefined 才会返回 true 。
shintendo
46 天前
@xuejianxianzun
这个不算冷的,ESLint 关于===的规则("eqeqeq")里,有个选项开关就是允许==null 。

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



shintendo
46 天前
@xuejianxianzun 补充一点,通常只会用==null ,不会用==undefined ,因为 undefined 是可以被重新赋值的
xuejianxianzun
45 天前
@shintendo 之前我没注意到这个知识点,感谢~
magicdawn
45 天前
FakerLeung
44 天前
@hronro 差不多,但是那是流水线上的基础门禁规则,大部门配的

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

https://ex.noerr.eu.org/t/1170998

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

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

© 2021 V2EX