ECMAScript | Оператор delete

ECMAScript | Оператор delete

Статическая семантика: ранние ошибки

UnaryExpression : delete UnaryExpression

 

Примечание

Последнее правило означает, что такие выражения, как delete (((foo))), вызывают ранние ошибки из-за рекурсивного применения первого правила.

 

Семантика времени выполнения: оценка

UnaryExpression : delete UnaryExpression

1. Пусть ref будет результатом вычисления UnaryExpression.
2. ReturnIfAbrupt(ref).
3. Если ref не является ссылочной записью Reference Record, верните true.
4. Если IsUnresolvableReference(ref) является true (истинно), то
   а. Утверждено: ref.[[Strict]] является false (неверна).
   b. Вернуть true.
5. Если IsPropertyReference(ref) является true (истинно), то
   а. Утверждено: ! IsPrivateReference(ref) - является false (ложь).
   b. Если IsSuperReference(ref) является true (истинно), выбросить исключение ReferenceError.
   c. Пусть baseObj будет ! ToObject(ref.[[Base]]).
   d. Пусть deleteStatus будет? baseObj.[[Delete]] (ref.[[ReferencedName]]).
   е. Если deleteStatus имеет значение false, а ref.[[Strict]] является true (истинно), генерировать исключение TypeError.
   f. Вернуть deleteStatus.
6. Иначе,
   а. Пусть base будет ref.[[Base]].
   b. Утверждено: base - это запись среды Environment Record.
   c. Вернуть ? base.DeleteBinding(ref.[[ReferencedName]]).

 

Примечание 1

Когда оператор удаления delete происходит в коде строгого режима, генерируется исключение SyntaxError, если его UnaryExpression является прямой ссылкой на переменную, аргумент функции или имя функции. Кроме того, если оператор удаления delete выполняется в коде строгого режима и удаляемое свойство имеет атрибут {[[Configurable]]: false} (или иначе не может быть удалено), генерируется исключение TypeError.

 

Примечание 2

Объект, который может быть создан на шаге 5.c, недоступен за пределами вышеуказанной абстрактной операции и внутреннего метода обычного объекта [[Delete]]. Реализация может решить избежать фактического создания этого объекта.

 

 

Информационные ссылки

Стандарт ECMAScript — Раздел «13.5 Unary Operators» — https://tc39.es/ecma262/#sec-unary-operators

Стандарт ECMAScript — Раздел «13.5.1 The delete Operator» — https://tc39.es/ecma262/#sec-delete-operator