如何检查潜在未定义对象上是否存在属性?

新手上路,请多包涵

所以在 SO 上有一些问题可以回答如何检查对象的属性是否存在。 示例 答案是使用 Object.prototype.hasOwnProperty()

但是,您将如何检查潜在未定义对象的属性?

如果有人试图直接检查未定义对象上是否存在属性,那么这将是一个引用错误。

从语义上讲,直接检查代码似乎更好 if (obj.prop) //dosomething 它显示了更清晰的意图。有什么办法可以做到这一点?最好是有内置的 Javascript 方法来做这样的事情还是按照惯例?

动机: 一个包添加了属性 user.session.email——但我正在检查电子邮件是否存在,而不是会话,尽管会话可能不存在。

更新: 许多答案都说使用 && 运算符来短路。我知道这是一个可能的解决方案,但它并不是我们所需要的,因为我们似乎正在围绕 JS 对象语法工作——也就是说,虽然你真的想检查一个对象的属性,您被迫检查该对象是否存在才能这样做。

标记为已关闭的注意事项 为什么将其 标记为已关闭?假设这是重复的链接可能不会产生相同的答案。我们正在寻找更好、更语义化的解决方案,并将此标记为关闭会假设“嵌套”===“可能未定义”。

这个问题有争议地结束了: 因为我现在无法回答我自己的问题。最近, 这里 的第一阶段提出了一项解决这个问题的提案。同样,该问题需要一个更具语义的解决方案,如提案中所示。

原文由 steviesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 204
1 个回答

如果您确定父对象存在,则:

 if(obj && obj.key) {
  console.log(obj.key);
}

但是,如果 obj 不存在,这个例子将会失败。

 if (obj && obj.key) {
  console.log(obj.key);
}

…这就是为什么您可能想在检查属性时检查对象是否已定义。这可确保在满足条件且尚未设置属性对象时不会出现运行时错误。

 if(typeof obj != "undefined" && obj.key) {
  console.log('you will not see this logged')
}

您会注意到上面的示例没有抛出异常。

 var obj = {key: 1};

if(typeof obj != "undefined" && obj.key) {
  console.log('we have obj! and val is : ' + obj.key)
}

这是一种更具防御性的方法,但它允许可移植性。如果您想将您的逻辑提取到一个模块中以供重用,您可能想要检查该对象是否也存在,或者冒着您可能不一定关心的应用程序区域出现意外错误的风险。

原文由 Seth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题