Синтаксис унарных операторов
UnaryExpression [Yield, Await] :
UpdateExpression [?Yield, ?Await]
delete UnaryExpression [?Yield, ?Await]
void UnaryExpression [?Yield, ?Await]
typeof UnaryExpression [?Yield, ?Await]
+ UnaryExpression [?Yield, ?Await]
— UnaryExpression [?Yield, ?Await]
~ UnaryExpression [?Yield, ?Await]
! UnaryExpression [?Yield, ?Await]
[+Await] AwaitExpression [?Yield]
Оператор delete
Статическая семантика: ранние ошибки
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]]. Реализация может решить избежать фактического создания этого объекта.
Оператор void
Семантика времени выполнения: оценка
UnaryExpression : void UnaryExpression
1. Пусть expr будет результатом вычисления UnaryExpression. 2. Выполнить ? GetValue(expr). 3. Вернуть undefined.
GetValue должен быть вызван, даже если его значение не используется, поскольку оно может иметь наблюдаемые побочные эффекты.
Оператор typeof
Семантика времени выполнения: оценка
UnaryExpression : typeof UnaryExpression
1. Пусть val будет результатом вычисления UnaryExpression. 2. Если val является ссылочной записью Reference Record, тогда а. Если IsUnresolvableReference(val) является true (истинно), вернуть «undefined». 3. Установите val на ? GetValue(val). 4. Верните строку в соответствии с таблицей 41.
Таблица
Тип val | Результат |
---|---|
Undefined | «undefined» |
Null | «object» |
Boolean | «boolean» |
Number | «number» |
String | «string» |
Symbol | «symbol» |
BigInt | «bigint» |
Object (не реализует [[Call]]) | «object» |
Object (реализует [[Call]]) | «function» |
Таблица 41: Результаты оператора typeof
Дополнительную запись, относящуюся к внутреннему слоту [[IsHTMLDDA]], можно найти в B.3.7.3.
Оператор унарный плюс +
Унарный оператор + преобразует свой операнд в числовой тип Number.
Семантика времени выполнения: оценка
UnaryExpression : + UnaryExpression
1. Пусть expr будет результатом вычисления UnaryExpression. 2. Вернуть ? ToNumber(? GetValue(expr)).
Оператор унарный минус —
Унарный оператор минус — преобразует свой операнд в числовой тип Number, а затем отменяет его. Отрицание +0𝔽 дает -0𝔽, а отрицание -0𝔽 дает +0𝔽.
Семантика времени выполнения: оценка
UnaryExpression : — UnaryExpression
1. Пусть expr будет результатом вычисления UnaryExpression. 2. Пусть oldValue будет ? ToNumeric(? GetValue(expr)). 3. Пусть T будет Type(oldValue). 4. Вернуть ! T::unaryMinus(oldValue).
Побитовый оператор НЕ (~)
Семантика времени выполнения: оценка
UnaryExpression : ~ UnaryExpression
1. Пусть expr будет результатом вычисления UnaryExpression. 2. Пусть oldValue будет ? ToNumeric(? GetValue(expr)). 3. Пусть T будет Type(oldValue). 4. Вернуть ! T::bitwiseNOT(oldValue).
Логический оператор НЕ (!)
Семантика времени выполнения: оценка
UnaryExpression : ! UnaryExpression
1. Пусть expr будет результатом вычисления UnaryExpression. 2. Пусть oldValue будет! ToBoolean(? GetValue(expr)). 3. Если oldValue является true (истинно), вернуть false. 4. Вернуть истину true
Информационные ссылки
Стандарт ECMAScript — Раздел «13.5 Unary Operators» — https://tc39.es/ecma262/#sec-unary-operators