Проверка существования свойств
Объекты в языке JavaScript можно рассматривать как множества свойств, и нередко бывает полезно иметь возможность проверить принадлежность к множеству – проверить наличие в объекте свойства с данным именем. Выполнить такую проверку можно с помощью:
- оператора
in
- методов
hasOwnProperty()
иpropertyIsEnumerable()
- просто обратившись к свойству
____________
Оператор in
требует, чтобы в левом операнде ему было передано имя свойства (в виде строки) и объект в правом операнде. Он возвращает true, если объект имеет собственное или унаследованное свойство с этим именем:
var o = { x: 1 }
"x" in o; // true: o имеет собственное свойство "x"
"y" in o; // false: o не имеет свойства "y"
"toString" in o; // true: o наследует свойство toString
___________
Метод hasOwnProperty()
объекта проверяет, имеет ли объект собственное свойство с указанным именем. Для наследуемых свойств он возвращает false
:
var o = { x: 1 }
o.hasOwnProperty("x"); // true: o имеет собственное свойство x
o.hasOwnProperty("y"); // false: не имеет свойства y
o.hasOwnProperty("toString"); // false: toString - наследуемое свойство
__________
Метод propertyIsEnumerable()
накладывает дополнительные ограничения по сравнению с hasOwnProperty()
. Он возвращает true
, только если указанное свойство является собственным свойством, атрибут enumerable
которого имеет значение true
. Свойства встроенных объектов не являются перечислимыми. Свойства, созданные обычной программой на языке JavaScript, являются перечислимыми, если не был использован один из методов ECMAScript 5, представленных ниже, которые делают свойства неперечислимыми.
[объект].propertyIsEnumerable([свойство])
__________
Часто вместо оператора in
достаточно использовать простое выражение обращения к свойству и использовать оператор !==
для проверки на неравенство значению undefined
:
var o = { x: 1 }
o.x !== undefined; // true: o имеет свойство x
o.y !== undefined; // false: o не имеет свойства y
o.toString !== undefined; // true: o наследует свойство toString
Однако оператор in
отличает ситуации, которые неотличимы при использовании представленного выше приема на основе обращения к свойству. Оператор in
отличает отсутствие свойства от свойства, имеющего значение undefined
. Взгляните на следующий пример:
var o = { x: undefined } // Свойству явно присвоено значение undefined
o.x !== undefined // false: свойство имеется, но со значением undefined
o.y !== undefined // false: свойство не существует
"x" in o // true: свойство существует
"y" in o // false: свойство не существует
delete o.x; // Удалить свойство x
"x" in o // false: оно больше не существует