有没有更好的方法来检查Javascript中是否存在变量?

时间:2019-07-09 23:14:50

标签: javascript reactjs object

目前,我(在项目中的许多地方)正在检查数据是否在一个对象的根目录下存在,只是为了查看下一个层次是否存在,只是要查看下一个等等。

这可能看起来像这样:

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"

希望这很有道理,不确定是否有更好的方法!

4 个答案:

答案 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等...