实施 isNil

Implementing isNil

我正在实现一个看似微不足道的实用函数来检查值是 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 and equality 规则,但 Lodash 的实施实际上有优势吗?

这两个表达式在功能上似乎是等价的 (source)。因此,lodash 的实现会更可取,因为它需要的比较稍微少一些。

value === null || value === undefinedvalue == null 是等价的,在 Abstract Equality Comparison Algorithm:

的规范中可以看出

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

[...]

  1. If x is null and y is undefined, return true.
  2. If x is undefined and y is null, return true.

ESLint 的 "eqeqeq" 规则不相关,因为它仅用于 linting,它不会在 ECMAScript 本身中强制执行任何内容。而 lodash 不使用该规则。

从技术上讲,没有真正的优势,因为它具有完全相同的结果。有人可能会争辩 value == null 可能会更快,因为它只进行一次相等性检查并且不会像您的第一个示例那样执行最多两次 Strict Equality Comparison Algorithm 调用。这很可能根本无关紧要,因为即使有差异,也很小。

就我个人而言,我会使用 value === null || value === undefined,因为它更清晰,甚至不需要文档。此外,像 uglify 这样的工具可以很容易地将 value === null || value === undefined 替换为 value == null 用于生产。