Estoy tratando de ver de dénde sale el valor de la variable `y´en un código de Javascript y 2 líneas más arriba está la notación:
y || p()(0);
¿Qué significa esto?
Estoy tratando de ver de dénde sale el valor de la variable `y´en un código de Javascript y 2 líneas más arriba está la notación:
y || p()(0);
¿Qué significa esto?
Aunque amenadiel dio una buena respuesta, yo quiero dar otra haciendo referencia y explicando a que se refiere el operador || cuando trabaja con variables como en el ejemplo que mostraste
function test(argument){
// Si el argumento no es dado se pondrá por defecto 'Hello world'
argument = argument || 'Hello world';
return argument;
}
console.log(test('Hola mundo')); // Hola mundo
console.log(test()); // Hello world
Entonces en tu caso
// Esto equivaldría a que si y no está definida y/o inicializada su valor dependerá de lo que retorne la función p()(0)
y || p()(0);
Ejemplo de lo anterior:
function test(argument){
argument = argument || override('Hello world')
return argument;
}
function override(data){
return test(data);
}
console.log(test('Hola mundo')); // Hola mundo
console.log(test('Hey!')); // Hey!
console.log(test()); // Hello world
Aunque este post es ya viejuno, pero por añadir un poco sobre el tema del || (OR):
Voy a partir de que se sabe lo que es un valor truthy y uno falsy. A grandes rasgos un valor truthy es un valor que al evaluarlo en un contexto de lógica booleana (por ejemplo al hacer un if) se identifica como un valor de verdad (true) y uno falsy es un valor que se evalúa como un valor de falsedad (false). Los valores falsy son false
, 0
, -0
, 0n
, ""
, null
, undefined
y NaN
. Los valores truthy son todos los que no son falsy. Es decir, si hacemos:
if (0) {
console.log("truthy");
} else {
console.log("falsy");
}
Como vemos el if evalúa la expresión y decide que subprograma ejecutar en función de si el resultado de la expresión es truthy o falsy. Pasa lo mismo al hacer while, usar el operador ternario (x ? y : z), etc.
Una vez sabemos lo que es un valor truthy o falsy, hay que decir que el operador ||
es un operador que acepta dos expresiones como operandos, una a la izquierda y una a la derecha, y cuando se evalúa lo que hace es:
Esto tiene dos connotaciones importantes:
Es decir si tenemos esto:
function f1() { console.log("Evalúo f1"); return "hola"; } // Truthy
function f2() { console.log("Evalúo f2"); return 0; } // Falsy
console.log(f1() || f2());
En ese caso no se llega a evaluar f2, porque el resultado de f1 es truthy. Si lo hacemos al revés:
function f1() { console.log("Evalúo f1"); return "hola"; } // Truthy
function f2() { console.log("Evalúo f2"); return 0; } // Falsy
console.log(f2() || f1());
En este caso se evalúa f2 primero, como el resultado es falsy tiene evaluar f1()
Además:
var nombre = username || "John Doe";
var llevarAbrigo = haceFrio || llueve || estaNevando || haceViento;
Es equivalente a:
var llevarAbrigo = haceFrio || (llueve || (estaNevando || haceViento))
Por lo que pasará lo mismo que con solo dos expresiones, se irá evaluando de de izquierda a derecha parándose solamente si encuentra que una de las expresiones es truthy.
Más información:
||
es una OR
&&
es una AND
!
es una NOT