我正在使用ESLint检查我的javascript代码,我发现了“意外使用未定义”的警告
陈述是
if (data.items === undefined) {...}
Data.items通常等于JSON对象,但在某些情况下它可能是未定义的,如果是这种情况我想采取单独的操作。
要摆脱此警告,是否适合使用
if (data.items === false) {...}
这两种陈述在这种情况下是否相同?
答案 0 :(得分:2)
人们经常建议这样做以检查是否存在值:
if (typeof data.items === "undefined" || data.items === null)
值得注意的是,它与完全有效的完全相同:
if (data.items == null)
它存在问题的唯一原因是为初学者创建的短信规则并强加给每个人。
== null
执行的操作是检查null
或undefined
。当然,假设您无法理解==
的行为并且记住== null
匹配的两个值 - 即null
和{{1},您的短信会尖叫对你},您经常将数据与之比较的两个最常见的值。
当短信开始抱怨时,我们不得不通过改变所有代码来膨胀我们的代码:
undefined
为:
if (x == null)
但显然它不够冗长,现在我们必须写:
if (x === null || x === undefined)
我确信有一天人们会发现它仍然太短,一种更正确的方式会被发明。在此之前,这是测试存在价值的当前有福的方式。
顺便说一下,我不推荐使用:
if (x === null || typeof x === 'undefined')
因为它不仅会匹配if (!x)
和null
,还会匹配undefined
,false
和空字符串。事实上,我很惊讶,这种结构仍然允许这种结构并且还没有迫使我们使用它:
0
我确定这只是时间问题。
答案 1 :(得分:1)
虽然if
语句会将单个值(false
,null
和undefined
)评估为假,但并不能使它们完全相同。 null
和undefined
可以==
评估为真,但false
不等效,即使null
和{{ 1}},undefined
将返回false。
TL; DR - 否,它们不相同。
答案 2 :(得分:1)
不,它们不等同。为了使它们等效,undefined === false
必须是true
。但是,===
执行严格相等比较,这意味着不同数据类型的值永远不会相等。 false
是 Boolean 数据类型的值,undefined
是未定义数据类型的值。因此undefined === true
为false
。
如果您想明确测试值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