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

时间:2016-08-25 02:16:24

标签: javascript object

所以关于S.O.的问题回答如何检查对象上的属性是否存在。 Example答案是使用Object.prototype.hasOwnProperty()

但是,如何检查可能未定义的对象的属性?

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

从语义上讲,直接检查代码if (obj.prop) //dosomething似乎更好 - 它显示更清晰的意图。有没有办法实现这个目标?优选地,是否有内置的Javascript方法来执行此类操作或按照惯例?

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

更新:许多答案都说要使用&&操作员短路。我知道这是一个可能的解决方案,但它并不完全是所期望的,因为我们似乎正在使用JS对象语法 - 也就是说,虽然你想真正检查一个属性在一个对象上,你被迫检查对象是否存在以便这样做。

注意标记为已关闭为什么标记为已关闭?假设这是重复的链接可能不会产生相同的答案。我们正在寻找一种更好,更具语义性的解决方案并将其标记为已关闭,这使得我们可以假设“嵌套”#34; ==="可能未定义"。

这个问题有争议: 因为我现在无法回答我自己的问题。截至最近,一项提案被提交到第1阶段here,可以解决这个问题。同样,问题需要一个更具语义性的解决方案,如提案中所示。

3 个答案:

答案 0 :(得分:19)

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

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)
}

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

答案 1 :(得分:10)

如果你想检查obj和prop存在(就像你在评论中提到的那样)你必须这样做:

if(obj && obj.hasOwnProperty('some'))if(obj && obj.some)

如注释中所述,如果未定义obj,则会抛出错误。更好的比较是:

if(typeof obj != "undefined" && obj.hasOwnProperty('some'))

答案 2 :(得分:-1)

您可以执行以下操作:

if(user.session && 'email' in user.session) //do something...

如果您确定已定义用户。