如何检查对象在JavaScript中是否具有特定属性?
考虑:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
那是最好的方法吗?
我对所给出的答案感到困惑-他们中的大多数都是完全错误的。当然,您可以拥有具有未定义,空值或假值的对象属性。因此,简单地将属性检查减少到typeof this[property]
甚至更糟,x.key
将给您完全误导的结果。
这取决于您要查找的内容。如果您想知道一个对象是否物理上包含一个属性(并且它不是来自原型链的某个地方),那么您object.hasOwnProperty
就可以这样做。所有现代的浏览器都支持它。(在Safari的较早版本(2.0.1和更早的版本中不存在),但是那些浏览器版本已经很少使用了。)
如果您要查找的是对象上具有可迭代的属性(当您遍历该对象的属性时,它将出现),则可以这样做:prop in object
将为您带来所需的效果。
因为使用hasOwnProperty
可能是您想要的,并且考虑到您可能需要一种备用方法,所以我向您提供以下解决方案:
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
上面是对的跨浏览器解决方案hasOwnProperty
,但有一个警告:无法区分原型和实例上具有相同属性的情况-
只是假设它来自原型。您可以根据自己的情况将其更改为宽容或严格,但是至少这应该会有所帮助。
问题内容: 在Go中,如何检查对象是否响应方法? 例如,在Objective-C中,可以通过执行以下操作来实现: 问题答案: 一个简单的选择是仅使用您要检查的方法声明一个接口,然后针对您的类型进行类型断言;例如: 如果您打算对自己的类型进行任何疯狂的操作,则可能要使用该软件包。http://golang.org/pkg/reflect
请看do while循环,我认为注释是不言自明的。我想检查该集合是否设置了所有具有符号a、b、c、d的卡片(借助数组或其他任何东西实现它)。
这里有几个关于如何检查对象中是否存在属性的答案。 我一直在使用 但我想知道这和
我有一个JSON对象,如下所示: 我想检查是否存在一个值为“id2”的id,java中是否有任何UTIL允许我这样做,而无需遍历所有对象并将字符串与目标进行比较? 附言:我不想知道“id”字段是否存在,使用JSONObject.has(键),这不是我要问的。
问题内容: 在遍历数组时,我需要一些帮助,我会不断卡住或重新发明轮子。 如何检查数组中是否有两个(或多个)相同的名称值?我不需要计数器,只需在数组值不是唯一的情况下设置一些变量即可。请记住,数组长度是动态的,数组值也是动态的。 问题答案: 使用array.prototype.map和array.prototype.some:
问题内容: 我试图得到: 在我自己的脚本中,我以前只是使用它,因为我从来不需要作为属性: 因此,对于第二个对象,我想出了以下方法作为一种快速解决方案-大部分都能奏效。;) 问题是,这取决于浏览器是否强制执行只读属性,而并非所有人都这样做。 有没有好的替代品? 问题答案: 这可能很有趣: 它是DOM Level2的一部分。 更新2 :这是我在自己的库中实现它的方式:(以前的代码在Chrome中不起作