Javascript 如果objectB可能存在也可能不存在,如何检查ObjectA内部的objectB中是否存在值

Javascript 如果objectB可能存在也可能不存在,如何检查ObjectA内部的objectB中是否存在值,javascript,Javascript,假设我们想要变量val中的值 情景1: Var ObjectA = {ObjectB:{val:"text"}} 如果我们想在val中获取值,我们可以像ObjectA.ObjectB.val那样访问。 我们将得到“文本” 情景2: Var ObjectB = {} 如果我想在val中获取值(它不在那里),如果我试图像ObjectA.ObjectB.val那样访问 我们会找到的 未捕获的TypeError:无法读取未定义的属性“val” 时间:1:5 规则是 我们不能将任何值设为null或初始

假设我们想要变量val中的值

情景1:

Var ObjectA = {ObjectB:{val:"text"}}
如果我们想在val中获取值,我们可以像
ObjectA.ObjectB.val
那样访问。 我们将得到
“文本”

情景2:

Var ObjectB = {}
如果我想在val中获取值(它不在那里),如果我试图像
ObjectA.ObjectB.val那样访问
我们会找到的

未捕获的TypeError:无法读取未定义的属性“val” 时间:1:5

规则是

  • 我们不能将任何值设为null或初始化任何值,我们只需获取这些值,并且必须使用它们
  • 如果
    ObjectB
    存在于
    ObjectA
    中,并不意味着val存在于
    ObjectB

  • 我只想知道变量val中是否存在一个值,而不影响其他任何事情。

    我会按顺序检查每件事情:

    if(ObjectA && ObjectA.ObjectB && ObjectA.ObjectB.val) {
        // Do something with ObjectA.ObjectB.val
    }
    

    如果这种构造对您来说太笨拙,那么您会想到另外两种可能性:

    • 在每个阶段填写默认值,即
      ((ObjectA | |{}).ObjectB |{}).val
    • 只测试最里面的值,但在
      try…catch
      块中(如果缺少一个外部值,则默默地放弃不可避免的错误)

    但是,这些都比读链版本更难读,性能也比较差,所以如果你的链很长,我只会考虑它们。

    如果你要找的键太过嵌套,你可以使用一个来自Load的工具(如果密钥不存在,你也可以添加一个默认值)。 无论哪种方式,您都可以这样检查是否存在:

    让myVal=null;
    
    如果(ObjectA&&ObjectA.ObjectB&&ObjectA.ObjectB.val)myVal=val为什么不能直接链接访问?ObjectA&&ObjectA.ObjectB&&ObjectA.ObjectB.val或使用任何基于路径的库等的等效对象?不要执行“规则是”。那是代码高尔夫。堆栈溢出不适用于代码高尔夫。@zixuan由于非客观评分标准,这将作为代码高尔夫的非主题立即关闭…@PatrickRoberts显然,您可以看到“规则是”。我不是说这应该迁移到代码高尔夫,我只是说我会把问题的这一部分改成不同的东西。有了它,可以简化为
    ObjectA?.ObjectB?.val
    @PatrickRoberts,这个建议在web浏览器中有任何支持吗?我不知道,但有一种方法允许您在已经在开发代码库的项目中使用它传送。