ECMAScript | Операторы отношения (Relational Operators)

ECMAScript | Операторы отношения (Relational Operators)

Примечание 1

Результат вычисления реляционного оператора всегда имеет тип Boolean, отражающий, сохраняется ли связь, указанная оператором, между двумя его операндами.

 

Синтаксис операторов отношения

RelationalExpression [In, Yield, Await] :

ShiftExpression [?Yield, ?Await]

RelationalExpression [?In, ?Yield, ?Await] < ShiftExpression [?Yield, ?Await]

RelationalExpression [?In, ?Yield, ?Await] > ShiftExpression [?Yield, ?Await]

RelationalExpression [?In, ?Yield, ?Await] <= ShiftExpression [?Yield, ?Await]

RelationalExpression [?In, ?Yield, ?Await] >= ShiftExpression [?Yield, ?Await]

RelationalExpression [?In, ?Yield, ?Await] instanceof ShiftExpression [?Yield, ?Await]

[+In] RelationalExpression [+In, ?Yield, ?Await] in ShiftExpression [?Yield, ?Await]

 

Примечание 2

Параметр грамматики [In] необходим, чтобы не путать оператор in в выражении отношения с оператором in в операторе for.

 

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

RelationalExpression : RelationalExpression < ShiftExpression

1. Пусть lref будет результатом вычисления RelationalExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления ShiftExpression.
4. Пусть rval будет ? GetValue(rref).
5. Пусть r будет ? IsLessThan(lval, rval, true).
6. Если r является undefined (не определено), вернуть false. В противном случае верните r.

RelationalExpression : RelationalExpression > ShiftExpression

1. Пусть lref будет результатом вычисления RelationalExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления ShiftExpression.
4. Пусть rval будет ? GetValue(rref).
5. Пусть r будет ? IsLessThan(rval, lval, false).
6. Если r является undefined (не определено), вернуть false. В противном случае верните r.

RelationalExpression : RelationalExpression <= ShiftExpression

1. Пусть lref будет результатом вычисления RelationalExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления ShiftExpression.
4. Пусть rval будет ? GetValue(rref).
5. Пусть r будет? IsLessThan(rval, lval, false).
6. Если r является true (истинно) или undefined (не определено), вернуть false. В противном случае верните true.

RelationalExpression : RelationalExpression >= ShiftExpression

1. Пусть lref будет результатом вычисления RelationalExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления ShiftExpression.
4. Пусть rval будет ? GetValue(rref).
5. Пусть r будет? IsLessThan(lval, rval, true).
6. Если r является true (истинно) или undefined (не определено), вернуть false. В противном случае верните true.

RelationalExpression : RelationalExpression instanceof ShiftExpression

1. Пусть lref будет результатом вычисления RelationalExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления ShiftExpression.
4. Пусть rval будет ? GetValue(rref).
5. Вернуть ? InstanceofOperator(lval, rval).

RelationalExpression : RelationalExpression in ShiftExpression

1. Пусть lref будет результатом вычисления RelationalExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления ShiftExpression.
4. Пусть rval будет ? GetValue(rref).
5. Если Type(rval) не является Object, выбросить исключение TypeError.
6. Вернуть ? HasProperty(rval, ? ToPropertyKey(lval)).

 

InstanceofOperator ( V, target )

Абстрактная операция InstanceofOperator (Экземпляр оператора) принимает аргументы V (значение языка ECMAScript) и цель target (значение языка ECMAScript). Она реализует общий алгоритм для определения, является ли V экземпляром цели target, либо обращаясь к методу @@hasInstance цели target, либо, в случае его отсутствия, определяя, присутствует ли значение свойства «prototype» цели target в цепочке прототипов V. При вызове она выполняет следующие шаги:

1. Если тип Type(target) не является Объектом, вызовите исключение TypeError.
2. Пусть instOfHandler будет ? GetMethod(target, @@hasInstance).
3. Если instOfHandler не является undefined, тогда
   а. Вернуть ! ToBoolean(? Call(instOfHandler, target, «V»)).
4. Если IsCallable(target) имеет значение false, выбросить исключение TypeError.
5. Вернуть ? OrdinaryHasInstance(target, V).

 

Примечание

Шаги 4 и 5 обеспечивают совместимость с предыдущими выпусками ECMAScript, в которых не использовался метод @@hasInstance для определения семантики оператора instanceof. Если объект не определяет или не наследует @@hasInstance, он использует семантику instanceof по умолчанию.

 

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

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