我正在实现一个看似微不足道的实用程序函数来检查值是null
还是undefined
。
我最初的实现是这样的:
function isNil(value) {
return value === null || value === undefined;
}
然后我查阅了Lodash的实现:
function isNil(value) {
return value == null
}
从表面上看,这似乎是一种天真的方法,因为它违反了esint的eqeqeq规则,并且只检查null
。
我猜这种方法之所以有效,是因为JavaScript的真实性和等式规则相结合,但Lodash的实现真的有优势吗?
value === null || value === undefined
和value == null
是等价的,这可以在抽象等式比较算法的规范中看到:
比较
x == y
,其中x
和y
是值,产生true或false。这样的比较如下:[…]
- 如果
x
为null且y
为未定义,则返回true- 如果
x
为未定义且y
为null,则返回true
ESLint的"eqeqeq"规则并不相关,因为它只是用于linting,它在ECMAScript本身中不强制执行任何内容。洛达什没有使用这个规则。
从技术上讲,没有真正的优势,因为它有完全相同的结果。有人可能会说value == null
可能更快,因为它只做一次相等检查,而不像第一个例子那样执行最多两次严格相等比较算法调用。这可能根本不重要,因为即使有差异,也会很小。
就我个人而言,我会使用value === null || value === undefined
,因为它更清晰,甚至不需要文档。此外,像uglify这样的工具可以很容易地用value == null
代替value === null || value === undefined
进行生产。
这两个表达式在功能上似乎是等效的(源代码)。因此,lodash的实现会更可取,因为它只需要稍微少一些比较。