ECMAScript | Унарные Операторы (Unary Operators)

ECMAScript | Унарные Операторы (Unary Operators)

Синтаксис унарных операторов

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

 

Примечание

Последнее правило означает, что такие выражения, как 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]]. Реализация может решить избежать фактического создания этого объекта.

 

Оператор 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