如果对象未定义,如何检查特定键是否未定义?

问题描述

我想做什么?

我想检查特定键是否为 undefined,但无法检查,因为对象的更高级别是 undefined

目前尝试这样做的代码是什么?

character 对象的结构是(在另一个存在的对象中):

{
  ...
  character: { 
    ...,archer: { 
      ...,description: "shoots things" 
    }
  }
}

我只想这样做,但会导致错误

if (character.archer.description !== undefined) { ... }

我已实施但希望优化的修复是这样的:

...
  if (character !== undefined) {
    if (character.archer !== undefined) {
      if (character.archer.description !== undefined) {
        setDescription(character.archer.description);
      }
    }
  }
...

我期望结果是什么?

我希望代码能够意识到 if 语句应该运行,即使 undefined of undefined,一般来说应该意味着 undefined

实际结果如何?

TypeError: Cannot read property 'undefined' of undefined.

我认为可能是什么问题?

由于 character.archerundefined(目前),我无法继续检查 character.archer.description

解决方法

您可以使用 optional chaining operatorall evergreen browsers today support。您只需在每个可能返回 ?(或 .,实际上,这也有效)的级别的 undefined 之前添加 null

代码示例:

if (character?.archer?.description !== undefined) { ... } 
,

这正是可选链运算符的用途!它看起来像这样 ?.,如果定义了左手,它将返回右手参数,否则将返回 undefined

useEffect(() => {
  const description = character?.archer?.description;
  if (description !== undefined) {
    setDescription(description);
  }
},[]);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...