¿Puede alguien me explique lo que es el LeftFirst
indicador booleano? al leer la especificación EcmaScript acerca [relacionales-operadores] ( https://tc39.es/ecma262/#sec-relational-operators "definición-operadores relacionales en ECMAScript") y Resumen relacional Comparación he encontrado algo así como la LeftFirst
bandera booleana que sea se convierte true
o false
, pero no sé lo que es el uso de la misma y por lo que está ahí alguien me puede explicar con claridad cuál es el propósito de la LeftFirst
bandera booleana y por qué se usa en la memoria la explicación que han dado no es mucho más clara que quiere saber lo que es el uso de la misma la leftFirst
bandera booleana y por qué se utiliza?
Como se anotó, es una de las entradas al algoritmo Resumen Comparación relacional . Su único propósito es determinar que operando el algoritmo de comparación se pasa a ToPrimitive primero, el de la izquierda ( leftFirst = true) o el de la derecha ( leftFirst = false). La razón es que el extracto relacional Comparación siempre hace una <
comparación, pero que también se usa en la evaluación de >
expresiones (con los operandos invertidos). Por eso, cuando el manejo de una >
, que necesita ser contada a utilizar ToPrimitive en la mano derecha operando en primer lugar.
Se puede ver utilizado en el primer paso del algoritmo:
- Si el LeftFirst bandera es cierto , entonces
- Deje px ser? ToPrimitive ( x , Número pista).
- Deje py sea? ToPrimitive ( y , Número pista).
- Si no,
NOTA: El orden de evaluación debe ser invertida para preservar izquierda a derecha evaluación.
- Deje py sea? ToPrimitive ( y , Número pista).
- Deje px ser? ToPrimitive ( x , Número pista).
También en la descripción:
La bandera se utiliza para controlar el orden en que se realizan las operaciones con efectos secundarios potencialmente visibles sobre x y y . Es necesario porque especifica ECMAScript de izquierda a derecha evaluación de expresiones.
Por ejemplo, si nos fijamos en los <
y >
las operaciones , la <
operación hace:
- Deje que r sea el resultado de realizar Abstract Relational Comparación lval <rval .
Que utiliza el valor predeterminado de leftFirst , que es true
. Así lval
se pasa a través ToPrimitive antes rval
.
Sin embargo, la >
operación hace:
- Deje que r sea el resultado de realizar Abstract Relational Comparación rval < lval con LeftFirst igual a falsa .
Observe que lo hace rval < lval
, no lval > rval
. Pero utiliza leftFirst = false
porque es importante que el derecho operando pasar a través ToPrimitive antes de que el operando de la izquierda, ya que la operación real es lval > rval
, por lo que lval
se debe pasar a través ToPrimitive primero.
En un comentario que has dicho:
Muchas gracias llegué a saber por qué, si
<
el operador esLeftFirst true
entonces ¿por qué<=
también no esLeftFirst true
y por qué, si>
el operador esLeftFirst false
el>=
operador también no esLeftFirst false
Es, definitivamente, un poco confuso. La razón de que <
y <=
no coinciden (y >
, y >=
no coinciden) es que las <=
/ >=
los operadores de invertir el resultado de la comparación abstracta Relacional (ARC). Entonces:
lval < rval
hace:let r = ARC(lval < rval, leftFirst = true); return r === undefined ? false : r; // Returns what ARC returned (but // turns `undefined` into `false`)
lval <= rval
hacelet r = ARC(rval < lval, leftFirst = false); return r === undefined ? true : !r; // Returns the *inverse* of what ARC // returned (and turns `undefined` // into `true`)
lval > rval
hace:let r = ARC(rval < lval, leftFirst = false); return r === undefined ? false : r; // Returns what ARC returned (but // turns `undefined` into `false`)
lval >= rval
hace:let r = ARC(lval < rval, leftFirst = true); return r === undefined ? true : !r; // Returns the *inverse* of what ARC // returned (and turns `undefined` // into `true`)
Una nota final, consideremos esto:
const obj = {
get lval() {
console.log("obj.lval was evaluated");
return {
valueOf() {
console.log("lval was passed through ToPrimitive");
return 42;
}
};
},
get rval() {
console.log("obj.rval was evaluated");
return {
valueOf() {
console.log("rval was passed through ToPrimitive");
return 24;
}
};
}
};
console.log("Using >");
const result1 = obj.lval > obj.rval;
// "obj.lval was evaluated"
// "obj.rval was evaluated"
// "lval was passed through ToPrimitive"
// "rval was passed through ToPrimitive"
console.log(result1);
// true
console.log("Using <");
const result2 = obj.lval < obj.rval;
// "obj.lval was evaluated"
// "obj.rval was evaluated"
// "lval was passed through ToPrimitive"
// "rval was passed through ToPrimitive"
console.log(result2);
// false
.as-console-wrapper {
max-height: 100% !important;
}
La salida que se ve desde que es la siguiente:
Usando> obj.lval se evaluó obj.rval se evaluó lval se pasó a través ToPrimitive rval se pasó a través ToPrimitive verdadera usandoEsto es lo que sucede a crear esa salida para >
:
- El
obj.lval > obj.rval
se evalúa la expresión - El
>
algoritmo de operador es ejecutado:- Se evalúa
lval = obj.lval
(pasos 1 y 2), que provoca la"obj.lval was evaluated"
salida - Se evalúa
rval = obj.rval
(pasos 3 y 4), que provoca la"obj.rval was evaluated"
salida - Se llama ARC (Paso 5):
ARC(obj.rval < obj.lval, leftFirst = false)
- ARC recieves
obj.rval
comox
yobj.lval
como sey
- ARC ve leftFirst =
false
y así lo hace:py = ToPrimitive(y)
(2.b Paso), que hace que la"lval was passed through ToPrimitive"
salidapx = ToPrimitive(x)
(2.c Paso), que hace que la"rval was passed through ToPrimitive"
salida
- vuelve ARC
false
- ARC recieves
- Se evalúa
- El
>
automatismo invierte el valor y la rentabilidad de retorno de ARCtrue
Esto es lo que sucede para crear la salida posterior para <
:
- El
obj.lval < obj.rval
se evalúa la expresión - El
<
algoritmo de operador es ejecutado:- Se evalúa
lval = obj.lval
(pasos 1 y 2), que provoca la"obj.lval was evaluated"
salida - Se evalúa
rval = obj.rval
(pasos 3 y 4), que provoca la"obj.rval was evaluated"
salida - Se llama ARC (Paso 5):
ARC(obj.lval < obj.rval)
(por defecto es true) leftFirst- ARC recieves
obj.lval
comox
yobj.rval
como sey
- ARC ve leftFirst =
true
y así lo hace:px = ToPrimitive(x)
(1.a Paso), que hace que la"lval was passed through ToPrimitive"
salidapy = ToPrimitive(y)
(1.b Paso), que hace que la"rval was passed through ToPrimitive"
salida
- vuelve ARC
false
- ARC recieves
- Se evalúa
- El
<
operador devuelve el valor de retorno de ARC,false