JavaScript 中是不是有用于检查对象属性的“not in”运算符?

Posted

技术标签:

【中文标题】JavaScript 中是不是有用于检查对象属性的“not in”运算符?【英文标题】:Is there a “not in” operator in JavaScript for checking object properties?JavaScript 中是否有用于检查对象属性的“not in”运算符? 【发布时间】:2011-12-19 19:44:42 【问题描述】:

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 部分是错误的。

【问题讨论】:

我认为您可能希望在您的函数中使用var id = ... 【参考方案1】:

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

只要否定你的条件,你就会在if中得到else逻辑:

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

【讨论】:

这种风格还修复了 JSHint “混淆使用 '!'” 警告,如果你这样做了 ( ! somekey in someobj ) 请注意 in 在原型链中搜索属性名称 anywhere。有关详细信息,请参阅我的answer。 我知道这是目前最好的解决方案,但其他人是否同意这有点难看? 如果它很难看,那么只需将它包装在一个函数中并给它起一个漂亮的名字?let keyExists = (key, obj) => key in obj 我完全同意。事实上,我的命名技巧也可以提高?。 let hasProperty“看起来”更好【参考方案2】:

两种快速的可能性:

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

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

【讨论】:

请改用'undefined' === typeof xxxundefined 不是保留字,实际上是一个可以被覆盖的全局变量(导致很难找到bug) @hippietrail 不起作用...在“!”之后需要括号和周围的'foo' in myObj) myObj['foo'] 可以作为属性存在并简单地设置为undefined(即,使用声明myObj.foo = undefined)。如果您真的想查看属性本身是否不存在,则需要 !('foo' in myObj) 表示法。 对于我们当中注重性能的人来说,检查myObj.foo === undefined 要快得多(尽管有潜在危险):jsperf.com/not-in-vs-is-undefined。 @hugomg 我不认为这是不使用=== undefined 的一个很好的论据。如果人们滥用编程语言,例如在 JavaScript 中覆盖 undefined,那么很多事情都会崩溃。另请参阅:***.com/questions/8783510/…【参考方案3】:

正如 Jordão 所说,否定它:

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

注意:上面的测试如果tutorTimes在原型链中有一个id,anywhere中指定的名称的属性。例如"valueOf" in tutorTimes 返回 true,因为它是在 Object.prototype 中定义的。

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

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

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

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

【讨论】:

将密钥括在引号中并使用if(!tutorTimes.hasOwnProperty('id')) ... 是否更安全 @MajidFouladpour id 是一个可以有任何值的变量,'id' 是一个包含两个字母 id 的字符串,所以hasOwnProperty(id)检查变量id中指定的属性是否存在,hasOwnProperty('id')检查是否存在名为id的属性。【参考方案4】:

我个人觉得

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

更容易阅读
if (!(id in tutorTimes))  ... 

但两者都可以。

【讨论】:

【参考方案5】:

你可以设置条件为假

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

【讨论】:

【参考方案6】:

我知道这是旧的,但这是另一个看起来不错的选项。

if (!tutorTimes[id]) ...

与重新分配 undefined 的人类似的陷阱

【讨论】:

以上是关于JavaScript 中是不是有用于检查对象属性的“not in”运算符?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象是不是在 JavaScript 中具有特定属性?

在 JavaScript 中,是不是有更简单的方法来检查属性的属性是不是存在?

检查 JavaScript 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]

Javascript:检查对象是不是没有属性或映射/关联数组是不是为空[重复]

检查是不是在 JavaScript 中覆盖了全局属性/函数

检查 JSP 中是不是存在属性