2010-12-15 23 views
10

en JavaScript, si tenemos algo de código como¿Cómo funciona la asignación lógica de JavaScript?

var a = "one"; 
var b = q || a; 
alert (b); 

El operador lógico OR asignará el valor de A a B, y la alerta será "uno".

¿Está limitado a asignaciones solamente o podemos usarlo en todas partes?

Parece que una cadena vacía se trata igual que indefinida. ¿Es esto correcto?

¿Cómo funciona esto con las variables Y? ¿Qué hay de las combinaciones de ellos?

¿Cuál es un buen ejemplo de cuándo usar estos modismos, o cuándo no?

+1

Ver [JavaScript O (||) Variable explicación de asignación ] (http://stackoverflow.com/questions/2100758/javascript-or-variable-assignment-explication) y [En Javascript, ¿qué significa cuando hay un operador lógico en una declaración de variable? ] (http://stackoverflow.com/questions/3088098/in-javascript-what-does-it-mean-when-there-is-a-logical-operator-in-a-variable-d). –

+1

No lo use. Es una construcción sintáctica estúpida que no es intuitiva y retrasa a muchas personas cuando lee el código. –

+5

@MK, no descarta una construcción común solo porque las personas que aún no saben JavaScript no están familiarizadas con ella. –

Respuesta

21

Para su q || a para evaluar a a, q debe ser un valor 'Falsy'. Lo que hizo se llama "evaluación de cortocircuito".

responder a sus preguntas:

  1. Los operadores lógicos (como e - &&, o - ||) se pueden utilizar en otras situaciones también. Más generalmente en declaraciones condicionales como if. More here

  2. Cadena vacía no es tratada como undefined. Ambos son valores falsos. Hay algunos valores falsy más. More here

  3. AND, o && en JavaScript, no es una variable.Es un operador

  4. La expresión idiomática que ha utilizado es bastante común.

    var x = val || 'default'; //is generally a replacement for

    var x = val ? val : 'default' //or

    if (val) var x = val; else var x = 'default';

6

La forma || obras en Javascript es:

  1. Si el operando de la izquierda se evalúa como true, devolver el operando de la izquierda
  2. De lo contrario, devuelve el operando de la derecha

& & obras de manera similar.

Puede hacer uso de esto para cheques existencia en línea, por ejemplo:

var foo = (obj && obj.property) 

establecerá foo-obj.property si se ha definido obj y "Truthy".

+0

Muy bien explicado !! – eddy

+1

* "Si el operando de la izquierda se evalúa como verdadero, devuelva el operando de la izquierda" * No, eso está mal. * Truthy *, no 'verdad'. –

1

Este comportamiento se comparte con otros lenguajes de scripting como Perl. El operador OR lógico puede usarse como una taquigrafía sintáctica para especificar valores predeterminados debido al hecho de que el operador OR lógico deja de evaluar sus operandos cuando encuentra la primera expresión que se evalúa como verdadera: "evaluar el primer operando y si el valor se interpreta como no es falso, asígnelo. De lo contrario, repita para el segundo operando ".

Me parece que a menudo uso este comportamiento para especificar valores predeterminados para los parámetros de la función. P.ej.

function myFunction(foo, bar) { 
    var fooValue = foo || "a"; 

    // no need to test fooValue -- it's guaranteed to be defined at this point 
} 
+0

¿Qué sucede si el valor de foo es falso (no "falso")? – JVM

+0

Eso dará como resultado fooValue == "a". En un contexto booleano falso, nulo, indefinido, 0, NaN y la cadena vacía, todos son falsos; consulte https://developer.mozilla.org/en-US/docs/Glossary/Falsy para obtener más información –

+0

Correcto. Entonces, esto podría fallar en el lugar donde uno realmente necesita como valor un valor falso. – JVM

1

No estoy muy seguro de entender su pregunta. Puede usar una expresión en cualquier lugar donde pueda usar una expresión, y un operador lógico en dos expresiones resulta en una expresión.

alert(q||a); 
alert(true||false); 

var x=5; 
var y=0; 
if (y!=0 && x/y>2) { /*do something*/ } 

El último bit es útil. Como la mayoría de los lenguajes, Javascript 'cortocircuitos' AND y OR. Si la primera parte de un AND es falsa, no evalúa el segundo bit, lo que le ahorra una división por 0. Si la primera parte de un OR es verdadera, no evalúa el segundo.

Pero puede usar operadores booleanos en cualquier lugar donde pueda usar una expresión.

1

JavaScript evalúa la lógica por veracidad/falsedad. Los valores como (false, "", nulo, undefined, 0, -0) se evalúan como lógicos falsos.

combinar esto con la evaluación perezosa, 'OR' operaciones son ahora evaluados desde left to right y paradas una vez true se encuentra. Dado que, en su ejemplo, la veracidad no es literalmente un booleano, se devuelve el valor.

En este caso:

x = 0; y = 5; alert(y || x)/*returns 5*/; alert(x || y)/*also returns 5*/; 

esto también puede haber otros objetos.

functionThatReturnsTrue() || functionThatDoesSomething(); 
0

EN MIEMBRO - no utilizar para la asignación de tipo booleano. Puede ser confuso Como indefinido! == falso, es decir, falso es un valor.

E.g. Si quieres copiar un valor de campo de un objeto si y sólo si ese campo se define

var bar.value = false; 
var foo = true; 

var foo = bar.value || foo; // ==> should be false as bar.value is defined 

Para la asignación de tipo booleano, u debe utilizar realmente

var foo = (bar.value !== undefined) ? bar.value : foo; 
Cuestiones relacionadas