Какой правильный способ проверить наличие свойства в JavaScript-объекте?
У меня есть пользовательский объект Javascript, который я создаю с помощью new
, и назначаю свойства на основе аргументов создания:
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
, но оно может быть чем-то вроде пустого объекта или массива. Однако, если вы хотите включить то, что правильно, если это может быть так, не стесняйтесь.
Ответы
Ответ 1
hasOwnProperty
- это именно то, что вы ищете, поскольку вы указываете "если свойство явно определено для этого объекта, а не в цепочке прототипов". Per https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty, "Этот метод может использоваться для определения того, имеет ли объект указанное свойство как прямое свойство этого объекта, в отличие от оператор, этот метод не проверяет цепочку прототипов объекта". - похоже, точно соответствует вашему требованию!
Ответ 2
Если вы ищете свойство, определенное в объекте, вы можете использовать метод hasOwnProperty объекта. например:
myObject = new MyObject();
// some code
if ( myObject.hasOwnProperty('prop') ) {
// prop exists
}
но это только для того, чтобы знать, определено ли такое свойство в самом объекте, но не его родителях. поэтому, если такое свойство наследуется объектом, вы не можете проверить его существование таким образом.
другой способ - проверить свойство на значение undefined. например:
if ( myObject.prop !== undefined ) {
// prop exists
}
не забывайте использовать оператор! == вместо!= потому что!= не будет отличаться от нуля и undefined, но! == делает. поэтому, если ваш объект имеет свойство, но значение null,!= вам не поможет. поэтому этот тест:
if ( myObject.prop ) {
}
могут иметь неправильные результаты, если "prop" имеет ложное или нулевое значение. но, сравнивая с undefined с! == оператором, вы можете быть уверены, что значения null/false не будут вас путать.
Ответ 3
Вы можете проверить существование variable
следующим образом:
if ( typeof variable === 'undefined' || variable === null ) {
// Do stuff
}
Он также может использоваться для properties
.