Для всех объектных типов и типов массивов результатом оператора typeof
является строка «object», поэтому он может быть полезен только для определения принадлежности значения к объектному или к простому типу. Чтобы отличить один класс объектов от другого, следует использовать другие инструменты, такие как оператор instanceof
(раздел 4.9.4), атрибут class
(раздел 6.8.2) или свойство constructor
(разделы 6.8.1 и 9.2.2).
Несмотря на то что функции в JavaScript также являются разновидностью объектов, оператор typeof
отличает функции, потому что они имеют собственные возвращаемые значения. В JavaScript имеется тонкое отличие между функциями и «вызываемыми объектами». Функции могут вызываться, но точно так же можно создать вызываемый объект - который может вызываться подобно функции, -не являющийся настоящей функцией. В спецификации ECMAScript 3 говорится, что оператор typeof
должен возвращать строку «function» для всех объектов базового языка, которые могут вызываться. Спецификация ECMAScript 5 расширяет это требование и требует, чтобы оператор typeof
возвращал строку «function» для всех вызываемых объектов, будь то объекты базового языка или среды выполнения. Большинство производителей броузеров для реализации методов своих объектов среды выполнения используют обычные объекты-функции базового языка JavaScript. Однако корпорация Microsoft для реализации своих клиентских методов всегда использовала собственные вызываемые объекты, вследствие чего в версиях до IE9 оператор typeof
возвращает строку «object» для них, хотя они ведут себя как функции. В версии ІЕ9 клиентские методы были реализованы как обычные объекты-функции базового языка. Подробнее об отличиях между истинными функциями и вызываемыми объектами рассказывается в разделе 8.7.7.
Унарный оператор delete
выполняет попытку удалить свойство объекта или элемент массива, определяемый операндом. [3] Программистам на C++ следует обратить внимание, что delete в JavaScript совершенно не похож на delete в C++. В JavaScript освобождение памяти выполняется сборщиком мусора автоматически, и беспокоиться о явном освобождении памяти не надо. Поэтому в операторе delete в стиле C++, удаляющем объекты без остатка, нет необходимости.
Подобно операторам присваивания, инкремента и декремента, оператор delete
обычно используется ради побочного эффекта, выражающегося в удалении свойства, а не ради возвращаемого значения. Ниже приводятся несколько примеров его использования:
var о = {х: 1, у: 2}; // Определить объект
delete о.х; // Удалить одно из его свойств
"х" in о // => false: свойство больше не существует
var а = [1,2,3]: // Создать массив
delete а[2]; // Удалить последний элемент массива
2 in а // => false: второй элемент больше не существует
a.length // => 3: обратите внимание, что длина массива при этом не изменилась
Внимание: удаленное свойство или элемент массива не просто получает значение undefined
. После удаления свойства оно прекращает свое существование. Попытка прочитать значение несуществующего свойства возвратит значение undefined
, но вы можете проверить фактическое наличие свойства с помощью оператора in
(раздел 4.9.3). Операция удаления элемента массива оставляет в массиве «дырку» и не изменяет длину массива. В результате получается разреженный массив.
Оператор delete
требует, чтобы его операнд был левосторонним выражением. Если операнд не является левосторонним выражением, оператор не будет выполнять никаких действий и вернет значение true
. В противном случае delete
попытается удалить указанное левостороннее выражение. В случае успешного удаления значения левостороннего выражения оператор delete
вернет значение true
. Не все свойства могут быть удалены: некоторые встроенные свойства из базового и клиентского языков JavaScript устойчивы к операции удаления. Точно так же не могут быть удалены пользовательские переменные, объявленные с помощью инструкции var. Кроме того, невозможно удалить функции, объявленные с помощью инструкции function
, а также объявленные параметры функций.
В строгом режиме, определяемом стандартом ECMAScript 5, оператор delete
возбуждает исключение SyntaxError
, если его операндом является неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции: он может оперировать только операндами, которые являются выражениями обращения к свойству (раздел 4.4). Кроме того, строгий режим определяет, что оператор delete
должен возбуждать исключение ТуреЕггог
, если запрошено удаление ненастраиваемого свойства (раздел 6.7). В обычном режиме в таких случаях исключение не возбуждается, и оператор delete
просто возвращает false
, чтобы показать, что операнд не был удален.
Читать дальше
Конец ознакомительного отрывка
Купить книгу