Foros del Web » Programando para Internet » Javascript »

Intentar sustituir condicionales por OR lógicos (||)

Estas en el tema de Intentar sustituir condicionales por OR lógicos (||) en el foro de Javascript en Foros del Web. Bueno, no sé si estáis familiarizados con el uso de esta estructura, voy a hacerle un poquito de introducción. Creo que equivale a un condicional ...
  #1 (permalink)  
Antiguo 18/10/2007, 15:31
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Intentar sustituir condicionales por OR lógicos (||)

Bueno, no sé si estáis familiarizados con el uso de esta estructura, voy a hacerle un poquito de introducción. Creo que equivale a un condicional if:
Código PHP:
var valor || B;
// esta sentencia equivaldría a lo siguiente:
var valor;
if( 
valor A;
else 
valor B;

// de esta manera:
var valor || 12;        // valor vale 12
var valor undefined || 45;    // valor vale 45
var valor = -15 || null;    // valor vale -15 
Está muy bien en el caso de tener que escoger entre dos variables, una que devuelve undefined y la otra que devuelve bien (true creo). Por ejemplo para argumentos opcionales en una función:
Código PHP:
function miFunc(elementos) {
  var 
elementos elementos || 1;
}
//aquí elementos dentro de la función siempre será el valor que le demos, pero si no le damos valor valdrá 1 


Pero tengo algunas dudas con este operador, no consigo entender bien su funcionamiento. Creo que escoge el valor que hace true. He descubierto que el orden importa. Si los dos elementos dan true se escoge el primero ( 12 || 12.5 ==> 12 ) ( 12.5 || 12 ==> 12.5 ).

Si los dos elementos dan false hay una preferencia, la cual no logro entender todavía, pero espero que exista. No se escoge el primero, lo raro es que siempre se escoge el último. Voy a poner un par de ejemplos que me he encontrado:

Código PHP:

 
// FALSE

Derechofalse || undefined undefined
Revés
:   undefined || false false

Derecho
false || NaN NaN
Revés
:   NaN || false false

Derecho
false || null null
Revés
:   null || false false


 
// CERO

Derecho|| undefined undefined
Revés
:   undefined || 0

Derecho
|| NaN NaN
Revés
:   NaN || 0

Derecho
|| null null
Revés
:   null || 0


 
// NaN

Derechoundefined || NaN NaN
Revés
:   NaN || undefined undefined

Derecho
NaN || null null
Revés
:   null || NaN NaN 
Entonces no lo tengo muy claro.
¿Existe alguna preferencia para estos operadores?
¿Si dan los dos true se escoge el primero? ¿Si dan los dos false se escoge el último?, ¿se puede confirmar ésto? En ese caso es interesante porque en el ejemplo de los argumentos opcionales, si quiero que elementos sea 0 cuando le pase undefined, tendría que poner el 0 al final.


¿Alguno sabe algo de ésto?
Gracias por participar
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #2 (permalink)  
Antiguo 19/10/2007, 02:17
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola:

Me parece que estás confundiendo un poco los conceptos, ya que el operador OR es un operador lógico, entonces las operaciones que no son lógicas posiblemente traten de de resolverse con algún criterio pre-establecido...

Por ejemplo, tanto null, como undefined, como NaN son equivalentes de false(0), y todo elemento distinto de cero o false es true...

Te propongo que añadas en tus pruebas otro elemento:

var bool = new Array();
bool[false] = "falso";
bool[true] = "cierto";

Si pruebas pones los resultados de las operaciones como índice de la nueva variable, verás que casi todos los ejemplos devuelven el valor undefined...

Supongo que sabes que también existe la operación or a nivel de bits (creo que es con una sola barra (15 | 15.5)...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 19/10/2007, 13:05
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola

Primera vez que veo el uso de esta estructura, es interesante.

Por los ejemplos que has dejado lo que interpreto es que no está evaluando ambos valores si no únicamente el primero y escoge este si devuelve false y si no el segundo, independientemente de lo que valga o devuelva el segundo.

Lo veo muy similar al funcionamiento de los operadores condicionales

pero es sólo una opinión, conste.
  #4 (permalink)  
Antiguo 19/10/2007, 18:48
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola caricatos y tunait, gracias por escribir.

Cita:
Iniciado por caricatos
Me parece que estás confundiendo un poco los conceptos, ya que el operador OR es un operador lógico, entonces las operaciones que no son lógicas posiblemente traten de de resolverse con algún criterio pre-establecido...
Ese criterio pre-establecido es el que espero encontrar, pero de momento no sé cual es...

Cita:
Iniciado por caricatos
Te propongo que añadas en tus pruebas otro elemento:

var bool = new Array();
bool[false] = "falso";
bool[true] = "cierto";

Si pruebas pones los resultados de las operaciones como índice de la nueva variable, verás que casi todos los ejemplos devuelven el valor undefined...
Lo siento, no he entendido lo que has querido decir aquí. ¿En qué consisten las pruebas que debo hacer?

Cita:
Iniciado por caricatos
Supongo que sabes que también existe la operación or a nivel de bits (creo que es con una sola barra (15 | 15.5)...
Sí, pero esas operan a nivel de bits dando resultados que dificilmente se pueden predecir si no hacemos cálculos raros (15 | 20 = 31). Aún nunca le he encontrado utilidad práctica a ésto en nada de lo que he llevado a cabo (¿vosotros?)
Código PHP:
01111   (15)
10100   (20)
--------
11111   (31
Aunque el operador a nivel de bits funciona bien por lo menos para los números (34 | undefined = 34), para los strings ( "hola" | undefined = 0 ); así que no serviría para lo mismo...


Cita:
Iniciado por tunait
Por los ejemplos que has dejado lo que interpreto es que no está evaluando ambos valores si no únicamente el primero y escoge este si devuelve false y si no el segundo, independientemente de lo que valga o devuelva el segundo.
Exacto, es ése su funcionamiento. Supongo que habría que quedarse con esta idea, he probado con todos los tipos: Number, Number negativo, String, String vacío, NaN, undefined, 0, Object vacío, Object lleno, Booleans... Y las únicas anomalías las he encontrado son esas que crearon el primer mensaje.



Bueno, si averiguo más os comento.
Un saludo a los dos
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 20/10/2007, 13:25
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola derkenuke y Helena:

Pongo énfasis en que se trata de un operador lógoco (tal como pone el título)... y lo que me extraña es que se pueda operar con valores no-lógicos, en lenguajes compilados seguro que no colaría, u obligaría a parsearlos... algo así como ((boolean) 15 || (boolean) 15.5)

Sobre el array con índice booleano sería para comprobar si se obtienen resultados lógicos:

<script>
var bool = new Array();
bool[false] = "falso";
bool[true] = "cierto";
document.write("<br />" + bool[10 || true]);
document.write("<br />" + bool[true || 10]);
document.write("<br />" + bool[10 || false]);
document.write("<br />" + bool[false || 10]);

document.write("<br />" + bool[10 && true]);
document.write("<br />" + bool[true && 10]);
document.write("<br />" + bool[10 && false]);
document.write("<br />" + bool[false && 10]);
</script>

Sobre el uso de la operación bit a bit, me acuerdo que en el viejo ms-dos, el bit más significativo en los colores se usaba para la intermitencia, y se conseguía haciendo el OR 1000000 y se quitaba con AND 0111111...
Una buena utilidad es el encriptamiento: usando el operador XOR con una clave se consigue una cadena ilegible, pero aplicándo una segunda vez esa misma operación con la misma clave se consigue la cadena original.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 21/10/2007, 01:38
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola otra vez:

Ne sé como no se me ocurrió antes un sistema para obtener el equivalente lógico de algunos valores (reservados, por ejemplo, como null, undefined...)

Se trata de la doble negación lógica:

function parseBoolean(x) {
return !!(x);
}

Con esto puede verse que el valor lógico para el 0 es false, y para el resto de números es true... también son false los valores null o undefined.

Saludos

P.D: Con esto creo que la respuesta a la incógnita sería que la lógica del operador es:
A || B := (parseBoolean(A)) ? A : B;

__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Última edición por caricatos; 21/10/2007 a las 04:00 Razón: un añadido
  #7 (permalink)  
Antiguo 21/10/2007, 09:41
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 11 meses
Puntos: 834
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola! En este enlace se habla acerca de ese uso de or y también del uso de !!. Es interesante: http://www.digital-web.com/articles/...pt_techniques/
  #8 (permalink)  
Antiguo 21/10/2007, 14:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola de nuevo

Cita:
Iniciado por caricatos
Sobre el array con índice booleano sería para comprobar si se obtienen resultados lógicos
Sí, estaba casi seguro de que los resultados eran boleanos, creo que no se me ocurrió comprobarlo.

El uso de operación bit a bit, es cierto que se utiliza en las codificaciones como MD5, no me había acordado.


Por otra parte, no sé si !!(x) hace lo mismo que Boolean(x), yo diría que sí (he probado con muchos tipos de variable). Supongo que tu conclusión de:
A || B := (parseBoolean(A)) ? A : B;
Está correcta, pero todavía me he encontrado con el siguiente problema:
Código PHP:
(NaN == NaN)  //da false, cosa que desconocía 
Entonces todo lo que daba NaN me ha saltado como error, pero si lo miramos bien y escribimos los resultados en el documento vemos que sí que es NaN, así que tu teoría está en lo cierto.


Supongo que hemos llegado a una conclusión.
¡Gracias!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 21/10/2007, 18:46
 
Fecha de Ingreso: diciembre-2003
Mensajes: 1.583
Antigüedad: 20 años, 3 meses
Puntos: 13
Re: Intentar sustituir condicionales por OR lógicos (||)

Creo que llegué un poco tarde, así que perdí un poco el hilo de la conversación y de las posibles conclusiones a las que hayan llegado. Hace un tiempo me encontré con este tipo de estructuras, y lo que aprendí en dicha oportunidad (mi comentario no será muy técnico) es que al hacer algo como A = B || C lo que le estás pidiendo al script es que si B es distinto a false, undefined, 0 o Nan, le asigne ese valor a la variable A; de lo contrario, que le asigne el valor de C, independiente del tipo de valor que sea.
__________________
El conocimiento es libre: Movimiento por la Devolución
  #10 (permalink)  
Antiguo 22/10/2007, 16:21
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Intentar sustituir condicionales por OR lógicos (||)

Hola frijolerou:

Sí, esa es la conclusión a la que hemos llegado, resumida en una frase

Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:04.