我正在实现一个看似简单的实用函数来检查值是null
还是undefined
。
我原来的实现看起来像这样:
function isNil(value) {
return value === null || value === undefined;
}
然后我查了Lodash's implementation:
function isNil(value) {
return value == null
}
从表面上看,这似乎是一种愚蠢的做法,因为它违反了eslint的eqeqeq rule以及只检查null
。
我猜这种方法是由于JavaScript truthiness和equality规则的组合而有效,但Lodash的实施是否真的有优势?
答案 0 :(得分:3)
value === null || value === undefined
和value == null
相同,可以在Abstract Equality Comparison Algorithm的规范中看到:
比较
x == y
,其中x
和y
是值,会产生 true 或 false 。这样的比较如下进行:[...]
- 如果
x
null 且y
未定义,请返回 true 。- 如果
醇>x
未定义且y
null ,请返回 true 。
ESLint的“eqeqeq”规则并不相关,因为它只适用于linting,它不会强制执行ECMAScript本身的任何内容。并且lodash不使用该规则。
从技术上讲,没有真正的优势,因为它具有完全相同的结果。有人可能认为value == null
可能更快,因为它只执行一次等式检查,并且不会像第一个示例那样执行最多两次Strict Equality Comparison Algorithm调用。它很可能根本不重要,即使存在差异,它也会非常小。
就个人而言,我会使用value === null || value === undefined
,因为它更清晰,甚至不需要文档。此外,uglify等工具可以轻松地将value === null || value === undefined
替换为value == null
进行生产。
答案 1 :(得分:1)
这两个表达式在功能上似乎是等价的(source)。因此,lodash的实现更可取,因为它需要的比较稍微少一些。