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
语句中。在我看来,设置 if
–else
语句只是为了使用 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 xxx
。 undefined
不是保留字,实际上是一个可以被覆盖的全局变量(导致很难找到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'
是一个包含两个字母 i 和 d 的字符串,所以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 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]