<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>
которого имеет значение
<b>true</b>
. Свойства встроенных объектов не являются перечислимыми. Свойства, созданные обычной программой на языке JavaScript, являются перечислимыми, если не был использован один из методов ECMAScript 5, представленных ниже, которые делают свойства неперечислимыми.
<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>