Несмотря на то что функции в JavaScript также являются разновидностью объектов, оператор
<b>typeof</b>
отличает функции, потому что они имеют собственные возвращаемые значения. В JavaScript имеется тонкое отличие между функциями и «вызываемыми объектами». Функции могут вызываться, но точно так же можно создать вызываемый объект - который может вызываться подобно функции, -не являющийся настоящей функцией. В спецификации ECMAScript 3 говорится, что оператор
<b>typeof</b>
должен возвращать строку «function» для всех объектов базового языка, которые могут вызываться. Спецификация ECMAScript 5 расширяет это требование и требует, чтобы оператор
<b>typeof</b>
возвращал строку «function» для всех вызываемых объектов, будь то объекты базового языка или среды выполнения. Большинство производителей броузеров для реализации методов своих объектов среды выполнения используют обычные объекты-функции базового языка JavaScript. Однако корпорация Microsoft для реализации своих клиентских методов всегда использовала собственные вызываемые объекты, вследствие чего в версиях до IE9 оператор
<b>typeof</b>
возвращает строку «object» для них, хотя они ведут себя как функции. В версии ІЕ9 клиентские методы были реализованы как обычные объекты-функции базового языка. Подробнее об отличиях между истинными функциями и вызываемыми объектами рассказывается в разделе 8.7.7.
4.13.3. Оператор delete
Унарный оператор
<b>delete</b>
выполняет попытку удалить свойство объекта или элемент массива, определяемый операндом. [3] Подобно операторам присваивания, инкремента и декремента, оператор
<b>delete</b>
обычно используется ради побочного эффекта, выражающегося в удалении свойства, а не ради возвращаемого значения. Ниже приводятся несколько примеров его использования:
<b>var о = {х: 1, у: 2}; // Определить объект</b>
<b>delete о.х; // Удалить одно из его свойств</b>
<b>"х" in о // => false: свойство больше не существует</b>
<b>var а = [1,2,3]: // Создать массив</b>
<b>delete а[2]; // Удалить последний элемент массива</b>
<b>2 in а // => false: второй элемент больше не существует</b>
<b>a.length // => 3: обратите внимание, что длина массива при этом не изменилась</b>
Внимание: удаленное свойство или элемент массива не просто получает значение
<b>undefined</b>
. После удаления свойства оно прекращает свое существование. Попытка прочитать значение несуществующего свойства возвратит значение
<b>undefined</b>
, но вы можете проверить фактическое наличие свойства с помощью оператора
<b>in</b>
(раздел 4.9.3). Операция удаления элемента массива оставляет в массиве «дырку» и не изменяет длину массива. В результате получается разреженный массив.
Оператор
<b>delete</b>
требует, чтобы его операнд был левосторонним выражением. Если операнд не является левосторонним выражением, оператор не будет выполнять никаких действий и вернет значение
<b>true</b>
. В противном случае
<b>delete </b>
попытается удалить указанное левостороннее выражение. В случае успешного удаления значения левостороннего выражения оператор
<b>delete</b>
вернет значение
<b>true</b>
. Не все свойства могут быть удалены: некоторые встроенные свойства из базового и клиентского языков JavaScript устойчивы к операции удаления. Точно так же не могут быть удалены пользовательские переменные, объявленные с помощью инструкции var. Кроме того, невозможно удалить функции, объявленные с помощью инструкции
<b>function</b>
, а также объявленные параметры функций.
В строгом режиме, определяемом стандартом ECMAScript 5, оператор
<b>delete</b>
возбуждает исключение
<b>SyntaxError</b>
, если его операндом является неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции: он может оперировать только операндами, которые являются выражениями обращения к свойству (раздел 4.4). Кроме того, строгий режим определяет, что оператор
<b>delete</b>
должен возбуждать исключение
<b>ТуреЕггог</b>
, если запрошено удаление ненастраиваемого свойства (раздел 6.7). В обычном режиме в таких случаях исключение не возбуждается, и оператор
<b>delete</b>
просто возвращает
<b>false</b>
, чтобы показать, что операнд не был удален.
Ниже приводится несколько примеров использования оператора
<b>delete</b>
:
<b>var о = {х:1, у:2}; // Определить переменную; инициализировать ее объектом </b>
<b>delete о.х; // Удалить одно из свойств объекта; вернет true</b>
<b>typeof о.х; // Свойство не существует; вернет "undefined"</b>
<b>delete о.х; // Удалить несуществующее свойство; вернет true</b>
<b>delete о; // Объявленную переменную удалить нельзя; вернет false</b>
<b> // В строгом режиме возбудит исключение.</b>
<b>delete 1; // Аргумент не является левосторонним выражением; вернет true</b>
<b>this.x =1; // Определить свойство глобального объекта без var</b>
<b>delete х; // Удалить: вернет true при выполнении в нестрогом режиме; в строгом</b>
<b> // режиме возбудит исключение. Используйте 'delete this.x' взамен, </b>
<b>х; // Ошибка времени выполнения: переменная х не определена</b>
С оператором delete мы снова встретимся в разделе 6.3.
4.13.4. Оператор void
Унарный оператор
<b>void</b>
указывается перед своим единственным операндом любого типа. Этот оператор редко используется и имеет необычное действие: он вычисляет значение операнда, затем отбрасывает его и возвращает
<b>undefined</b>
. Поскольку значение операнда отбрасывается, использовать оператор
<b>void</b>
имеет смысл только ради побочных эффектов, которые дает вычисление операнда.