relacionales operadores logicos ejemplos condicionales comparacion asignacion aritmeticos javascript variable-assignment logical-operators and-operator

operadores - Operador Javascript AND dentro de la asignación



operadores logicos (6)

Sé que en JavaScript puedes hacer:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

donde la variable oneOrTheOther tomará el valor de la primera expresión si no es null , undefined o false . En ese caso, se asigna al valor de la segunda declaración.

Sin embargo, ¿a oneOrTheOther se asigna la variable oneOrTheOther cuando usamos el operador AND lógico?

var oneOrTheOther = someOtherVar && "some string";

¿Qué pasaría cuando someOtherVar no sea falso?
¿Qué pasaría cuando someOtherVar es falso?

Solo estoy aprendiendo JavaScript y tengo curiosidad sobre lo que sucedería con la asignación junto con el operador AND.


Ejemplo de principiantes

Si está intentando acceder a "user.name", entonces sucede esto:

Uncaught TypeError: Cannot read property ''name'' of undefined

No temáis. Puede resolver esto usando el operador && en una asignación o con frecuencia llamado el operador de guardia ya que "guarda" el error indefinido.

Aquí hay algunos ejemplos que puede encontrar extraños, pero siga leyendo como se explica más adelante.

var user = undefined; var username = user && user.username; // no error, "username" assigned value of "user" which is undefined user = { username: ''Johnny'' }; username = user && user.username; // no error, "username" assigned ''Johnny'' user = { }; username = user && user.username; // no error, "username" assigned value of "username" which is undefined

Explicación : En la operación de guardia, cada término se evalúa de izquierda a derecha, uno a la vez . Si un valor evaluado es falso, la evaluación se detiene y ese valor se asigna. Si se alcanza el último elemento, se le asigna si es falso o no.

falsy significa que es uno de estos valores undefined, false, 0, null, NaN, '''' y truthy simplemente significa NO falsy.

Botón fácil para el método Guard

Utilice el operador de guardia hermoso de lodash para acceder a los datos anidados de esta manera:

// need to access obj.has.some.very.nested.stuff var val = _.get(obj, ''has.some.very.nested.stuff'');

ya que maneja las cosas && debajo del capó mientras que es agradable de usar en un método conveniente. Lodash _.get código fuente

Bonificación: el operador de quirófano

La otra asignación extraña útil que está en uso práctico es el operador OR que normalmente se usa para complementos como este:

this.myWidget = this.myWidget || (function() { // define widget })();

que solo asignará la porción del código si "this.myWidget" es falso. Esto es útil porque puedes declarar el código en cualquier lugar y muchas veces sin preocuparte si ha sido asignado o no previamente, sabiendo que solo se asignará una vez, ya que las personas que usan un complemento pueden declarar accidentalmente tu script src varias veces.

Explicación : cada valor se evalúa de izquierda a derecha, uno a la vez . Si un valor es verdad, detiene la evaluación y asigna ese valor, de lo contrario, continúa, si se alcanza el último elemento, se asigna independientemente de si es falso o no.

Crédito adicional: combinando && y || en una tarea

Ahora tiene el máximo poder y puede hacer cosas muy extrañas, como este ejemplo muy extraño de usarlo en un palíndromo.

function palindrome(s,i) { return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i); }

Explicación detallada aquí: comprobación de Palindrome en Javascript

Feliz codificación.


Básicamente, el operador lógico AND ( && ), devolverá el valor del segundo operando si el primero es truey , y devolverá el valor del primer operando si es falso , por ejemplo:

true && "foo"; // "foo" NaN && "anything"; // NaN 0 && "anything"; // 0

Tenga en cuenta que los valores falsy son aquellos que fuerzan a false cuando se usan en contexto booleano, son null , undefined , 0 , NaN , una cadena vacía y, por supuesto, false , cualquier otra cosa coerce a true .


Citando a Douglas Crockford 1 :

El operador && produce el valor de su primer operando si el primer operando es falso. De lo contrario, produce el valor del segundo operando.

1 Douglas Crockford: JavaScript: Las buenas partes - Página 16


De acuerdo con la sección 11.11 de ECMAScript anotada :

En el caso del operador lógico O (||),

expr1 || expr2 Devuelve expr1 si se puede convertir a verdadero; de lo contrario, devuelve expr2. Por lo tanto, cuando se usa con valores booleanos, || devuelve verdadero si cualquiera de los operandos es verdadero; si ambos son falsos, devuelve falso.

En el ejemplo dado,

var oneOrTheOther = someOtherVar || "estos no son los droides que estás buscando ... avanza";

El resultado sería el valor de SomeOtherVar, si Boolean (someOtherVar) es verdadero . (Consulte. Verdad de una expresión ). Si es falso, el resultado sería "estos no son los droides que estás buscando ... avanza";

Y en el caso del operador lógico AND (&&),

Devuelve expr1 si se puede convertir a falso; de lo contrario, devuelve expr2. Por lo tanto, cuando se usa con valores booleanos, && devuelve verdadero si ambos operandos son verdaderos; de lo contrario, devuelve falso.

En el ejemplo dado,

caso 1: cuando Boolean (someOtherVar) es falso: devuelve el valor de someOtherVar.

caso 2: cuando Boolean (someOtherVar) es verdadero: devuelve "estos no son los droides que estás buscando ... avanza".


He estado viendo && abusado aquí en el trabajo para las declaraciones de asignación. La preocupación es doble: 1) La verificación del "indicador" a veces es una función con gastos generales que los desarrolladores no tienen en cuenta. 2) Es fácil para los desarrolladores simplemente verlo como un control de seguridad y no considerar que están asignando información falsa a sus var. Me gusta que tengan una actitud de tipo seguro, así que les pido que cambien esto:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

a esto:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

para que obtengan un número entero como se esperaba


&& veces se llama operador de guardia .

variable = indicator && value

se puede usar para establecer el valor solo si el indicador es verdadero.