目前,我(在项目中的许多地方)正在检查数据是否在一个对象的根目录下存在,只是为了查看下一个层次是否存在,只是要查看下一个等等。
这可能看起来像这样:
let name = display.data ? display.data ? data.name.bio ? data.name.bio.details ? :"Name N/A" : "Name N/A" : "Name N/A" : "Name N/A"
不是通过这种方式进行检查,而是有一种方法可以直接调用data.name.bio.details
,而不会引发错误,但会默默地退回到未定义状态?
例如如果我打电话给data.name.bio.details
并且data.name.bio
不存在,我会得到一个错误消息,那就不是那么沉默。
我可以做这样的事情,当.bio不存在时,它不会尖叫流血的谋杀吗?:
var name = data.name.bio.details || "Name N/A"
希望这很有道理,不确定是否有更好的方法!
答案 0 :(得分:2)
使用逻辑AND &&
和OR ||
:
var name = data && data.name && data.name.bio && data.name.bio.details || "Name N/A";
如果不确定是否定义了data
,也可以使用try / catch-如果未定义data
,则上面将引发ReferenceError:
try {
var name = data.name.bios.details;
} catch(e) {
var name = "Name N/A";
}
答案 1 :(得分:1)
如果您要转换代码,请签出tc39/proposal-optional-chaining。
有一个Babel插件可以为您处理。
var name = data?.name?.bio?.details || "Name N/A"
显然,这仍然不能按原样工作,但是值得考虑,如果您已经在使用Babel(或类似产品)!
答案 2 :(得分:0)
老实说,我的会和其他人相似,但是我更喜欢这条路线。
编辑:
我在想另一种方法,让它不再那么冗长,我到达了。
((typeof data != 'undefined') ? data.name && data.name.bio && data.name.bio.details && data.name.bio.details || "Name NA" : "Name NA")
它将对数据执行空检查,然后使用其他方法进行评估(老实说,我忘了它叫什么),然后它将返回适当的值。
编辑:修复了在Edge中失败的问题。在Edge,Chrome和Firefox中进行了测试。还删除了第一种方法。
答案 3 :(得分:0)
!! yourVar 上面将检查yourVar不为空,未定义,不为null等...