Статическая семантика: ранние ошибки
UnaryExpression : delete UnaryExpression
- Это синтаксическая ошибка, если UnaryExpression содержится в коде строгого режима, а производным UnaryExpression является PrimaryExpression : IdentifierReference, MemberExpression : MemberExpression . PrivateIdentifier, CallExpression : CallExpression . PrivateIdentifier, OptionalChain : ?. PrivateIdentifier или OptionalChain : OptionalChain . PrivateIdentifier.
- Это синтаксическая ошибка, если производное UnaryExpression является PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList и CoverParenthesizedExpressionAndArrowParameterList в конечном итоге выводит фразу, которая при использовании вместо 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]]).
Когда оператор удаления delete происходит в коде строгого режима, генерируется исключение SyntaxError, если его UnaryExpression является прямой ссылкой на переменную, аргумент функции или имя функции. Кроме того, если оператор удаления delete выполняется в коде строгого режима и удаляемое свойство имеет атрибут {[[Configurable]]: false} (или иначе не может быть удалено), генерируется исключение TypeError.
Объект, который может быть создан на шаге 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