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

ste*_*jay 22 javascript object

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

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

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

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

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

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

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

这个问题是有争议的: 因为我现在无法回答我自己的问题.截至最近,这里提出了一项提案,可以解决这个问题.同样,问题需要一个更具语义性的解决方案,如提案中所示.

Set*_*eth 20

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

if(obj && obj.key) {
  console.log(obj.key);
}
Run Code Online (Sandbox Code Playgroud)

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

if (obj && obj.key) {
  console.log(obj.key);
}
Run Code Online (Sandbox Code Playgroud)

...这就是为什么你可能想检查在检查属性时是否定义了对象的原因.这可确保在命中条件且尚未设置属性的对象时不会出现运行时错误.

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

您会注意到上面的示例不会引发异常.

var obj = {key: 1};

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

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

  • 注意`var a = {a:false,b:0,c:null}`打破这些测试,因为`aa`和`ab`和`ac`都评价为不真实,所以`if(a && aa) {...}`不会认为它是定义的,但确实如此. (8认同)
  • 注意`typeof obj!="undefined"`如果在`typeof`检查后的某个点用`let`或`const`定义了'obj`,则会给出引用错误. (2认同)

Nis*_*tha 10

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

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

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

if(typeof obj != "undefined" && obj.hasOwnProperty('some'))
Run Code Online (Sandbox Code Playgroud)