检查未定义变量与错误变量

Checking for undefined variable vs false variable

我正在使用 ESLint 检查我的 javascript 代码,我发现 "Unexpected use of undefined"

的警告

声明是

if (data.items === undefined) {...}

Data.items 通常等于 JSON 对象,但在某些情况下它可能只是未定义,如果是这种情况我想采取单独的行动。

要消除这个警告,使用

是否合适
if (data.items === false) {...}

在这种情况下,这两个语句是否等价?

虽然 if 语句会将各个值(falsenullundefined)评估为虚假值,但它并不认为它们正是相同的。 nullundefined 可以被 == 评估为 true,但是 falsenot 等价的,即使 null undefined=== 将 return 为假。

TL;DR- ,它们不等价。

不,它们不等价。 要使它们等价,undefined === false 必须是 true。但是,=== 执行 strict 相等比较,这意味着不同数据类型的值永远不会相等。 falseBoolean 数据类型的值,undefinedUndefined 数据类型的值。因此 undefined === truefalse.


如果你想在不引用 undefined 的情况下显式测试值 undefined,你可以使用 typeof:

if (typeof data.items === 'undefined')

如果要测试 属性 items 存在性 ,可以使用 in 运算符或 .hasOwnPropery:

if (!data.hasOwnProperty('items'))
if (!('items' in data))

如果知道 data.items 的可能值是 undefined 或一个对象,您可以简单地让 JavaScript 的类型转换为您工作并使用

if (!data.items)

如果 data.items 是一个对象(包括数组),!data.items 将是 false。如果是undefined,就是true

两者都是 falsy 值,但并不相同。除了 Felix Kling 提到的之外,如果你想检查变量的 existence,我认为一个相当安全的方法是 coffeescript 是如何做到的:

if(typeof data.items === "undefined" || data.items === null)


此外,您当前检查未定义的方式会尝试将其等同于名为未定义的对象。现在现代浏览器已经使这个对象不可变并将其初始值设置为未定义的原始值,但我相信曾经有一段时间它是可变的。在这种情况下,如果有人要更改 undefined (对象)的值,您的检查将失败! :D

人们经常建议这样做来检查值是否存在:

if (typeof data.items === "undefined" || data.items === null)

值得注意的是,它与完全有效的完全相同:

if (data.items == null)

它有问题的唯一原因是为初学者创建并强加给每个人的 linter 规则。

== null 所做的是检查 nullundefined。当然,你的 linter 会在假设你不能被信任理解 == 的行为并记住 == null 匹配的两个值 - 即 nullundefined,您经常将数据与之进行比较的两个最常见的值。

当 linter 开始抱怨时,我们不得不通过更改所有代码来膨胀我们的代码:

if (x == null)

至:

if (x === null || x === undefined)

但显然不够冗长,现在我们必须写:

if (x === null || typeof x === 'undefined')

我相信总有一天人们会发现它仍然太短,并且会发明一种更正确的方法。到那时,这是当前测试值是否存在的好方法。

顺便说一句,我不推荐使用:

if (!x)

因为它不仅会匹配 nullundefined,还会匹配 false0 和空字符串。事实上,我很惊讶 linters 仍然允许这种构造并且还没有强迫我们使用它:

if (x === false || x === 0 || x === '' || x === null || typeof x === 'undefined')

不过我相信这只是时间问题。