JavaScript中是否有一个“ not in”运算符来检查对象属性?


195

JavaScript中是否存在某种“不在”运算符来检查对象中是否不存在属性?我在Google或Stack Overflow上找不到任何相关信息。这是我正在使用的此类功能的一小段代码:

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

如您所见,我会将所有内容放到else声明中。对于我来说,仅使用该部分来建立ifelse语句似乎是错误的else


4
我认为您可能希望var id = ...发挥职能。
科比2012年

Answers:


359

设置if / else语句仅使用else部分对我来说似乎是错误的...

只需取消条件即可,您将获得else逻辑if

if (!(id in tutorTimes)) { ... }

11
这种样式还修复了JSHint“混淆使用'!'”的警告,如果您这样做的话,将会得到警告( ! somekey in someobj )
mikemaccana 2012年

3
请注意,原型链中任何位置搜索属性名称。请参阅我的答案以获取更多详细信息。
一些

29
我知道这是目前最好的解决方案,但是其他人是否同意这有点丑陋?
约拿(Jonah)2013年

3
如果它很丑,那么只需将其包装在一个函数中并给它起一个漂亮的名字🙃– let keyExists = (key, obj) => key in obj
Kamafeather

我完全同意。确实,我的命名技巧也可以提高😁。let hasProperty“看起来”更好
Kamafeather

38

就像Jordão所说的,只需否定它:

if (!(id in tutorTimes)) { ... }

注意:以上测试是否在原型链中的任何地方,tutorTimes是否具有在id中指定名称的属性。例如"valueOf" in tutorTimes返回true,因为它是在Object.prototype中定义的。

如果要测试当前对象中是否不存在属性,请使用hasOwnProperty:

if (!tutorTimes.hasOwnProperty(id)) { ... }

或者,如果您可能具有hasOwnPropery键,则可以使用以下键:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

这是任何更安全的包装在引号和使用的关键if(!tutorTimes.hasOwnProperty('id')) ...
Majid Fouladpour '18

@MajidFouladpourid是可以具有任何值的变量,'id'是具有两个字母id的字符串,因此请hasOwnProperty(id)检查变量id中指定的属性是否存在,并hasOwnProperty('id')检查是否存在名为id的属性。
一些

24

我个人觉得

if (id in tutorTimes === false) { ... }

容易阅读比

if (!(id in tutorTimes)) { ... }

但两者都可以。


我使用您的解决方案,使之更易于阅读。
Sukma Saputra

14

两种快速的可能性:

if(!('foo' in myObj)) { ... }

要么

if(myObj['foo'] === undefined) { ... }

5
使用'undefined' === typeof xxx代替。undefined不是保留字,实际上是可以覆盖的全局变量(导致难以发现错误)
hugomg 2011年

9
@hippietrail不起作用...在“!”之后需要括号 及周围'foo' in myObj)
菲尔·库珀

4
myObj['foo']可以作为属性存在,并且可以简单地设置为undefined(即,使用语句myObj.foo = undefined)。如果您真的想查看属性本身是否不存在,则需要使用!('foo' in myObj)符号。
理查德·康纳马切

对于我们当中注重性能的人员而言,检查myObj.foo === undefined速度要快得多(尽管可能很危险):jsperf.com/not-in-vs-is-undefined
etpinard

@hugomg我不认为这不是很好的论点=== undefined。如果人们通过执行诸如undefinedJavaScript重写之类的操作滥用编程语言,则很多事情可能会中断。此外,见:stackoverflow.com/questions/8783510/...
ZERO3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.