Проверка существования свойств

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

<<< back

results matching ""

    No results matching ""