JavaScript. Подробное руководство, 6-е издание, стр. 66

<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>”х&quot; in о; // true: о имеет собственное свойство &quot;х&quot;</b>

<b>&quot;у&quot; in о; // false: о не имеет свойства &quot;у&quot;</b>

<b>&quot;toString&quot; in о; // true: о наследует свойство toString</b>

Метод

<b>hasOwnProperty()</b>
объекта проверяет, имеет ли объект собственное свойство с указанным именем. Для наследуемых свойств он возвращает
<b>false</b>
:

<b>var о = { х: 1 }</b>

<b>о.hasOwnPropertyC'x&quot;); // true: о имеет собственное свойство х</b>

<b>о.hasOwnPropertyC'y&quot;); // false: не имеет свойства у</b>

<b>о.hasOwnProperty(&quot;toString&quot;); // 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(&quot;x“); // true: о имеет собств. перечислимое свойство х </b>

<b>о.propertyIsEnumerable(&quot;у&quot;); // false: у - унаследованное свойство, не собств.</b>

<b>Object.prototype.propertyIsEnumerable(&quot;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>&quot;х&quot; in о                 // true: свойство существует</b>

<b>&quot;у” in о                 // false: свойство не существует</b>

<b>delete о.х;              // Удалить свойство х</b>

<b>&quot;х&quot; 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>