如何检查是否创建了这样的匿名对象:
var myObj = {
prop1: 'no',
prop2: function () { return false; }
}
确实定义了prop2吗?
prop2
将始终定义为函数,但对于某些对象,它不是必需的,也不会被定义。
我尝试了这里建议的内容:How to determine if Native JavaScript Object has a Property/Method?但我认为它不适用于匿名对象。
答案 0 :(得分:241)
typeof myObj.prop2 === 'function';
会告诉您函数是否已定义。
if(typeof myObj.prop2 === 'function') {
alert("It's a function");
} else if (typeof myObj.prop2 === 'undefined') {
alert("It's undefined");
} else {
alert("It's neither undefined nor a function. It's a " + typeof myObj.prop2);
}
答案 1 :(得分:35)
您想要hasOwnProperty()
:
var myObj1 = {
prop1: 'no',
prop2: function () { return false; }
}
var myObj2 = {
prop1: 'no'
}
alert(myObj1.hasOwnProperty('prop2')); // returns true
alert(myObj2.hasOwnProperty('prop2')); // returns false
参考文献:Mozilla,Microsoft,phrogz.net。
答案 2 :(得分:12)
typeof myObj.prop2 === 'function'
如果属性名称不是动态/生成的myObj.hasOwnProperty('prop2')
如果属性名称是动态的,只检查它是否是直接属性(而不是原型链)'prop2' in myObj
如果属性名称是动态的,请检查原型链答案 3 :(得分:8)
“匿名对象”是什么意思? myObj
不是匿名的,因为您已将对象文字指定给变量。你可以测试一下:
if (typeof myObj.prop2 === 'function')
{
// do whatever
}
答案 4 :(得分:1)
一种方法必须是if (typeof myObj.prop1 != "undefined") {...}
答案 5 :(得分:1)
最好使用Object.prototype.hasOwnProperty.call(obj, method)
<块引用>在 ECMAScript 5.1 中,添加了 Object.create,它允许创建具有指定 [[Prototype]] 的对象。 Object.create(null) 是一种常用模式,用于创建将用作 Map 的对象。当假设对象具有来自 Object.prototype 的属性时,这可能会导致错误。此规则防止直接从对象调用某些 Object.prototype 方法。
<块引用>此外,对象可能具有隐藏 Object.prototype 上的内置函数的属性,这可能会导致意外行为或拒绝服务安全漏洞。例如,网络服务器解析来自客户端的 JSON 输入并直接在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户端可能会发送像 {"hasOwnProperty": 1} 这样的 JSON 值并导致服务器崩溃。
<块引用>为了避免像这样的细微错误,最好始终从 Object.prototype 调用这些方法。例如,foo.hasOwnProperty("bar") 应该替换为 Object.prototype.hasOwnProperty.call(foo, "bar")。
const myObj = {
prop1: 'no',
prop2: function () { return false }
}
console.log(Object.prototype.hasOwnProperty.call(myObj, 'prop2'))
console.log(Object.prototype.hasOwnProperty.call(myObj, 'prop3'))
答案 6 :(得分:0)
我知道这是一个老问题,但是令我惊讶的是,当OP只想检查其存在性时,所有答案都确保该方法存在并且是一个函数。要知道它是一个函数(正如许多人所述),您可以使用:
typeof myObj.prop2 === 'function'
但是您也可以使用以下条件:
typeof myObj.prop2
甚至:
myObj.prop2
之所以这样,是因为一个函数的求值为true
,而undefined
的求值为false
。因此,如果您知道该成员存在,那么它可能只是一个函数,则可以使用:
if(myObj.prop2) {
<we have prop2>
}
或在表达式中:
myObj.prop2 ? <exists computation> : <no prop2 computation>