Excavando a través de la fuente glMatrix-0.9.5.min.js utilizada en mi proyecto webGL y encontré varias líneas de código como este ...

vec3.negate = function (a, b)
{
    b || (b = a); // <-- What exactly does this line do?

    b[0] = -a[0];
    b[1] = -a[1];
    b[2] = -a[2];

    return b;
};

No estoy seguro de qué está haciendo ese código o incluso si es un error teniendo en cuenta que es un archivo de terceros, pero también sé que no estoy completamente al día con JavaScript como idioma. (Por ejemplo, acabo de enterarme de los protocolos debido a esto. Concepto extraño / interesante).

Entonces, ¿es válido? Y si es así, ¿qué está haciendo exactamente?

Supongo que es una forma abreviada de lo siguiente, que dice 'Si' b 'no está configurado, configúrelo en'

if(!b)
{
    b = a;
}

Que también se puede escribir

if(!b) b = a;

Lo cual diría es mucho más claro. Pero de nuevo, supongo lo que eso realmente significa / hace. Podría estar equivocado

Seguimiento:

¿Son iguales estas dos condiciones si?

if(!b){ ... }

if(b == undefined){ ... }

Me pregunto si hay una complicación entre 'indefinido' y un valor definido que es 'nulo'

1
Mark A. Donohoe 11 may. 2016 a las 20:37

4 respuestas

La mejor respuesta

Básicamente se trata de establecer el valor de b en a si b no está definido a través del operador || que se puede usar como un operador de fusión nula en Javascript.

Podría pensar en términos de una declaración if de la siguiente manera:

if(b == undefined){
   b = a;
}

Una cuestión de preferencia

En última instancia, es una cuestión de preferencia con respecto a lo que tiene más sentido, pero cualquiera de los enfoques que encontrará en esta discusión probablemente sean opciones válidas:

// Explicitly using undefined in the comparison
if(b == undefined) { b = a }
// Using an if-statement (with a not) 
if(!b){ b = a }
// Using a ternary operator
b = b ? || a

Acerca de su seguimiento

Seguimiento: ¿Son iguales estas dos condiciones si?

si (! b) {...}

if (b == indefinido) {...}

Me pregunto si hay una complicación entre 'indefinido' y un valor definido que es 'nulo'

Sí, puede haber diferencias como se ve con una cadena vacía, que tendría los siguientes resultados:

var b = '';
!b                // true
b == undefined    // false

Diferenciar los valores null y undefined puede ser complicado y dado que está un poco fuera del alcance de esta pregunta, puede considerar revisar esta discusión relacionada sobre el tema, que comúnmente recomienda el uso de if(b == null) { b = a; } en lugar de los controles contra undefined.

1
Community 23 may. 2017 a las 10:28

Eso significa:

b = b ? b : a; //or
b = b || a;
2
Grissom 11 may. 2016 a las 17:39

Esta es la abreviatura de if (!b) { b = a }

Vamos a descomponerlo:

A la izquierda de || se afirma sobre la veracidad de b http://james.padolsey.com/javascript/truthy-falsey/

Si b es verdadero, entonces la parte a la derecha de || no será evaluada. Si b es falsey, entonces a b se le asignará el valor / referencia de a.

2
ken4z 11 may. 2016 a las 17:41

Una mejor manera de escribir eso sería

b = b || a;
4
Jordan Davidson 11 may. 2016 a las 17:40