Результат вычисления реляционного оператора всегда имеет тип 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]
Параметр грамматики [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