Проверка существования свойств
Объекты в языке 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: оно больше не существует