JavaScript. Подробное руководство, 6-е издание
Часть 66 из 535 Информация о книге
<b>delete this.f; // Это свойство также нельзя удалить</b>При удалении настраиваемых свойств глобального объекта в нестрогом режиме допускается опускать ссылку на глобальный объект и передавать оператору
только имя свойства:<b>delete</b><b>this.x =1; // Создать настраиваемое глобальное свойство (без var)</b><b>delete х; // И удалить его</b>Однако в строгом режиме оператор
возбуждает исключение<b>delete</b>, если его операндом является неквалифицированный идентификатор, такой как х, поэтому необходимо указывать явное выражение обращения к свойству:<b>SyntaxError</b><b>delete х; // В строгом режиме возбудит исключение SyntaxError</b><b>delete this.x; // Такой способ работает</b>6.4. Проверка существования свойств
Объекты в языке JavaScript можно рассматривать как множества свойств, и нередко бывает полезно иметь возможность проверить принадлежность к множеству - проверить наличие в объекте свойства с данным именем. Выполнить такую проверку можно с помощью оператора
, с помощью методов<b>in</b>и<b>hasOwnProperty()</b>или просто обратившись к свойству.<b>propertylsEnumerable()</b>Оператор
требует, чтобы в левом операнде ему было передано имя свойства (в виде строки) и объект в правом операнде. Он возвращает<b>in</b>, если объект имеет собственное или унаследованное свойство с этим именем:<b>true</b><b>var о = { х: 1 }</b><b>”х" in о; // true: о имеет собственное свойство "х"</b><b>"у" in о; // false: о не имеет свойства "у"</b><b>"toString" in о; // true: о наследует свойство toString</b>Метод
объекта проверяет, имеет ли объект собственное свойство с указанным именем. Для наследуемых свойств он возвращает<b>hasOwnProperty()</b>:<b>false</b><b>var о = { х: 1 }</b><b>о.hasOwnPropertyC'x"); // true: о имеет собственное свойство х</b><b>о.hasOwnPropertyC'y"); // false: не имеет свойства у</b><b>о.hasOwnProperty("toString"); // false: toString - наследуемое свойство</b>Метод
накладывает дополнительные ограничения по сравнению с<b>propertylsEnumerable()</b>. Он возвращает<b>hasOwnProperty()</b>, только если указанное свойство является собственным свойством, атрибут<b>true</b>которого имеет значение<b>enumerable</b>. Свойства встроенных объектов не являются перечислимыми. Свойства, созданные обычной программой на языке JavaScript, являются перечислимыми, если не был использован один из методов ECMAScript 5, представленных ниже, которые делают свойства неперечислимыми.<b>true</b><b>var о = inherit({ у: 2 }); о.х = 1;</b><b>о.propertyIsEnumerable("x“); // true: о имеет собств. перечислимое свойство х </b><b>о.propertyIsEnumerable("у"); // false: у - унаследованное свойство, не собств.</b><b>Object.prototype.propertyIsEnumerable("toString”); // false: неперечислимое</b><b>var о = { х: 1 }</b><b>о.х !== undefined; // true: о имеет свойство х</b><b>о.у !== undefined; // false; о не имеет свойства у</b><b>o.toString !== undefined; // true: о наследует свойство toString</b>Однако оператор
отличает ситуации, которые неотличимы при использовании представленного выше приема на основе обращения к свойству. Оператор<b>in</b>отличает отсутствие свойства от свойства, имеющего значение<b>in</b>. Взгляните на следующий пример:<b>undefined</b><b>var о = { х: undefined } // Свойству явно присвоено значение undefined</b><b>о.х !== undefined // false: свойство имеется, но со значением undefined</b><b>о.у !== undefined // false: свойство не существует</b><b>"х" in о // true: свойство существует</b><b>"у” in о // false: свойство не существует</b><b>delete о.х; // Удалить свойство х</b><b>"х" in о // false: оно больше не существует</b>Обратите внимание, что в примере выше использован оператор
, а не<b>!==</b>. Опера¬торы<b>!=</b>и<b>!==</b>отличают значения<b>===</b>и<b>undefined</b>, хотя иногда в этом нет необходимости:<b>null</b><b>// Если о имеет свойство X, значение которого отлично от null и undefined,</b><b>// то удвоить это значение, </b><b>if (о.х != null) о.х *= 2;</b><b>// Если о имеет свойство х, значение которого не может быть преобразовано в false,</b>