JavaScript. Подробное руководство, 6-е издание
Часть 45 из 535 Информация о книге
Несмотря на то что функции в JavaScript также являются разновидностью объектов, оператор
отличает функции, потому что они имеют собственные возвращаемые значения. В JavaScript имеется тонкое отличие между функциями и «вызываемыми объектами». Функции могут вызываться, но точно так же можно создать вызываемый объект - который может вызываться подобно функции, -не являющийся настоящей функцией. В спецификации ECMAScript 3 говорится, что оператор<b>typeof</b>должен возвращать строку «function» для всех объектов базового языка, которые могут вызываться. Спецификация ECMAScript 5 расширяет это требование и требует, чтобы оператор<b>typeof</b>возвращал строку «function» для всех вызываемых объектов, будь то объекты базового языка или среды выполнения. Большинство производителей броузеров для реализации методов своих объектов среды выполнения используют обычные объекты-функции базового языка JavaScript. Однако корпорация Microsoft для реализации своих клиентских методов всегда использовала собственные вызываемые объекты, вследствие чего в версиях до IE9 оператор<b>typeof</b>возвращает строку «object» для них, хотя они ведут себя как функции. В версии ІЕ9 клиентские методы были реализованы как обычные объекты-функции базового языка. Подробнее об отличиях между истинными функциями и вызываемыми объектами рассказывается в разделе 8.7.7.<b>typeof</b>4.13.3. Оператор delete
Унарный оператор
выполняет попытку удалить свойство объекта или элемент массива, определяемый операндом. [3] Подобно операторам присваивания, инкремента и декремента, оператор<b>delete</b>обычно используется ради побочного эффекта, выражающегося в удалении свойства, а не ради возвращаемого значения. Ниже приводятся несколько примеров его использования:<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>(раздел 4.9.3). Операция удаления элемента массива оставляет в массиве «дырку» и не изменяет длину массива. В результате получается разреженный массив.<b>in</b>Оператор
требует, чтобы его операнд был левосторонним выражением. Если операнд не является левосторонним выражением, оператор не будет выполнять никаких действий и вернет значение<b>delete</b>. В противном случае<b>true</b>попытается удалить указанное левостороннее выражение. В случае успешного удаления значения левостороннего выражения оператор<b>delete </b>вернет значение<b>delete</b>. Не все свойства могут быть удалены: некоторые встроенные свойства из базового и клиентского языков JavaScript устойчивы к операции удаления. Точно так же не могут быть удалены пользовательские переменные, объявленные с помощью инструкции var. Кроме того, невозможно удалить функции, объявленные с помощью инструкции<b>true</b>, а также объявленные параметры функций.<b>function</b>В строгом режиме, определяемом стандартом ECMAScript 5, оператор
возбуждает исключение<b>delete</b>, если его операндом является неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции: он может оперировать только операндами, которые являются выражениями обращения к свойству (раздел 4.4). Кроме того, строгий режим определяет, что оператор<b>SyntaxError</b>должен возбуждать исключение<b>delete</b>, если запрошено удаление ненастраиваемого свойства (раздел 6.7). В обычном режиме в таких случаях исключение не возбуждается, и оператор<b>ТуреЕггог</b>просто возвращает<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>