检查未定义的变量与false变量

时间:2016-02-18 16:35:17

标签: javascript angularjs eslint

我正在使用ESLint检查我的javascript代码,我发现了“意外使用未定义”的警告

陈述是

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

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

要摆脱此警告,是否适合使用

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

这两种陈述在这种情况下是否相同?

4 个答案:

答案 0 :(得分:2)

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

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

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

if (data.items == null)

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

== null执行的操作是检查nullundefined。当然,假设您无法理解==的行为并且记住== null匹配的两个值 - 即null和{{1},您的短信会尖叫对你},您经常将数据与之比较的两个最常见的值。

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

undefined

为:

if (x == null)

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

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

我确信有一天人们会发现它仍然太短,一种更正确的方式会被发明。在此之前,这是测试存在价值的当前有福的方式。

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

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

因为它不仅会匹配if (!x) null,还会匹配undefinedfalse和空字符串。事实上,我很惊讶,这种结构仍然允许这种结构并且还没有迫使我们使用它:

0

我确定这只是时间问题。

答案 1 :(得分:1)

虽然if语句会将单个值(falsenullundefined)评估为假,但并不能使它们完全相同。 nullundefined可以==评估为真,但false 等效,即使null和{{ 1}},undefined将返回false。

TL; DR - ,它们不相同。

答案 2 :(得分:1)

不,它们不等同。为了使它们等效,undefined === false必须是true。但是,===执行严格相等比较,这意味着不同数据类型的值永远不会相等。 false Boolean 数据类型的值,undefined未定义数据类型的值。因此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

答案 3 :(得分:0)

两者都是Template.post_detail.helpers({ emailForUser( id ) { var user = Meteor.users.findOne({_id: id}); if( user ) { return user.emails[0].address; } } }); 值,但不一样。除了Felix Kling提到的内容之外,如果你想检查一个变量的存在,我认为一个相当安全的方法是falsy如何做到这一点:

coffeescript

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