假设我们想要变量val中的值。
场景1:
Var ObjectA = {ObjectB:{val:"text"}}
如果我们想在val中获得价值,我们可以像ObjectA.ObjectB.val
一样进行访问。
我们会得到"text"
方案2:
Var ObjectB = {}
如果我想获取val中的值(不存在),并且如果我尝试像ObjectA.ObjectB.val
那样访问
我们会得到
未捕获的TypeError:无法读取未定义的属性“ val” 在:1:5
规则是
ObjectB
中存在ObjectA
,则并不意味着val存在于ObjectB
中。我只想知道变量val中是否存在一个值而不会干扰其他任何事情。
答案 0 :(得分:2)
我将按顺序检查每件事:
if(ObjectA && ObjectA.ObjectB && ObjectA.ObjectB.val) {
// Do something with ObjectA.ObjectB.val
}
如果这种结构对您来说太笨拙,那么就会想到另外两种可能性:
((ObjectA || {}).ObjectB || {}).val
try...catch
块内(如果缺少外层值之一,则静默丢弃不可避免的错误)。但是,与&&-chaining版本相比,它们都更难读且性能较差,因此,仅当您的链很长时,我才会考虑使用它们。
答案 1 :(得分:0)
如果您要查找的密钥过于嵌套,则可以使用lodash中的get之类的工具(如果密钥不存在,您也可以添加默认值)。
您可以通过以下两种方式检查是否存在:
let myVal = null;
if (ObjectA && ObjectA.ObjectB && ObjectA.ObjectB.val) myVal = val;
此解决方案的一些注意事项是,如果val
的值为false
,例如,如果值为0
或false
(您可以阅读更多有关{ {3}})的值仍为null
。您可以通过使用一元运算符typeof
来避免这种情况:
let myVal = null;
if (typeof ObjectA !== "undefined" && typeof ObjectA.ObjectB !== "undefined" && typeof ObjectA.ObjectB.val !== "undefined") myVal = val;