2

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?

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
Pablo
  • 437
  • 5
  • 21

4 Answers4

5

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
Jorius
  • 6,109
  • 9
  • 28
  • 55
3

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:

  • Evaluar la primera expresión
  • Si el resultado de la primera expresión es truthy, devuelve el resultado de la primera expresión
  • Si el valor es falsy, devuelve el resultado de evaluar la segunda expresión.

Esto tiene dos connotaciones importantes:

  • Si la primera expresión es truthy, la segunda expresión no se llega a evaluar.
  • Valgan lo que valgan las expresiones, se devolverá el resultado de evaluar la primera o el resultado de evaluar la segunda.

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:

  • En ningún momento para estos ejemplos se está devolviendo obligatoriamente true o false, se devuelve los valores que tengan los resultados de las expresiones sea lo que sea.
  • El uso que se hace generalmente es para asignar un valor por defecto en caso de que una primera variable no exista. Ejemplo: var nombre = username || "John Doe";
  • Este tipo de evaluación se conoce como evaluación de cortocircuito, o en algunos sitios evaluación perezosa.
  • El hecho de que se devuelva el tipo de los resultados de las expresiones es una particularidad de JavaScript
  • Las expresiones se pueden encadenar y funcionan de la misma manera. Ejemplo:
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.

  • Finalmente este funcionamiento es análogo para el operador && (AND) solo que en este caso, la segunda expresión solo se evalúa si la primera es truthy.

Más información:

ordago
  • 4,509
  • 12
  • 26
3

p es una función que devuelve otra función f

p()(0) 

Equivale a hacer

f(0)

Dicho esto, la expresión

y || f(0)

Se evalúa a true si y o f(0) son "verdaderos" (truthy).

Con un código minificado, no es más lo que se puede decir.

ffflabs
  • 21,223
  • 25
  • 48
-2
  • || es una OR
  • && es una AND
  • ! es una NOT
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
  • 1
    Hola, esta respuesta hace referencia sólo a parte de la pregunta (`||`) y no está del todo clara. Deberías añadir algo más de información para extenderla y concretarla. Por favor lee [answer] y completa el [tour] donde encontrarás recomendaciones para que tus preguntas sean mejor recibidas (y así ganarás tu primera medalla). – Alvaro Montoro May 18 '20 at 13:43