我有一个使用new
创建的自定义Javascript对象,并根据创建参数指定属性:
function MyObject(argument) {
if (argument) {
this.prop = "foo";
}
}
var objWithProp = new MyObject(true); // objWithProp.prop exists
var objWithoutProp = new MyObject(false); // objWithoutProp.prop does not exist
测试对象prop
属性是否存在的正确方法是什么?我已经看到了以下使用的方法,但我不确定这些方法中的任何一种是否是最佳方式:
if (obj.prop) {}
if (obj.hasOwnProperty("prop")) {}
if ("prop" in obj) {}
具体来说,我只对测试是否为此对象明确定义属性感兴趣,而不是在原型链中。此外,该值永远不会设置为null
或undefined
,但它可能类似于空对象或数组。但是,如果你想包括正确的方法,那么可以自由。
答案 0 :(得分:30)
hasOwnProperty
正好您要查找的内容,因为您指定“如果为此对象显式定义属性,而不是在原型链中”。 Per https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty,“此方法可用于确定对象是否具有指定属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链。” - 似乎完全符合您的要求!
答案 1 :(得分:8)
如果要查找对象中定义的属性,可以使用该对象的hasOwnProperty方法。像这样:
myObject = new MyObject();
// some code
if ( myObject.hasOwnProperty('prop') ) {
// prop exists
}
但这只是要知道对象本身是否定义了这样的属性,而不是它的父节点。所以如果这个属性是由对象继承的,你就不能像这样测试它的存在。
另一种方法是针对未定义的值测试属性。像这样:
if ( myObject.prop !== undefined ) {
// prop exists
}
记得使用!==运算符而不是!=因为!=在null和undefined之间没有区别,但是!==确实如此。因此,如果您的对象具有属性但值为null,则!=将无法帮助您。所以这个测试:
if ( myObject.prop ) {
}
如果“prop”具有false或null值,则可能有错误的结果。但通过使用!==运算符与undefined进行比较,您可以确定null / false值不会让您感到困惑。
答案 2 :(得分:2)
您可以按如下方式检查variable
是否存在:
if ( typeof variable === 'undefined' || variable === null ) {
// Do stuff
}
它也可以用于properties
。