Operadores logicos recargados ( I )

Una de los aspectos que más me agradan de JavaScript es la flexibilidad que exhiben los operadores lógicos, permitiendo resumir operaciones en una unica sentencia.

La caracteristica responsable de dicha flexibilidad es que dichos operadores no devuelven (necesariamente) valores booleanos, sino el valor (o el último de ellos si son varios) que cumpla la condición de la expresión.

Operador lógico OR (||)

Una expresión típica como puede ser la definición de un valor por defecto puede rehacerse en una única sentencia.

function hello(name) {
	// definimos un valor por defecto
	if(!name) {
		name = "world";
	}
	return "hello " + name;
}

hello(); // "hello world";

Utilizando el operador lógico OR (||), simplificamos (la ya simple de por sí) expresión:

function hello(name) {
	name = name || "world";
	return "hello " + name;
}

hello(); // "hello world";

No hay demasiada ciencia al respecto, se evalúan los operandos secuencialmente hasta satisfacer la expresión o finalizarla. Como es de esperar, en caso de que la condición se cumpla antes de evalúar la totalidad de la misma, el resto no es siquiera evaluado (caso típico del operador OR).

var result = true || notDefined;
result; // true

var result = notDefined || true;
// ReferenceError: notDefined is not defined

De la misma manera, se pueden lograr resultados más crípticos pero no menos efectivos.

// Ejecutamos el callback si es que exite
if(callback) {
	callback.apply(context, [data, msg, options]);
} else {
	(function() {
		//callback por defecto
	}).apply(context, [data, msg, options]);
}

// Resumiendo
(callback || function() {
	//callback por defecto
}).apply(context, [data, msg, options]);

Operador ternario ( ? : )

Si dudas el más exótico de los operadores disponibles, puede reemplazar y ser reemplazado por distintas expresiones lógicas.

// Utilizando el operador if
var value = defaultValue;
if(validate()) {
	value = getValue;
}

// Utilizando operador ternario
var value = validate() ? getValue() : defaultValue;

// Operadores logicos tradicionales
var value = validate() && getValue() || defaultValue;

También puede utilizarse anidado, logrando reducir en gran medida el código requerido.

var animal;

// Utilizando un if else clásico
if(isCat()) {
    animal = new Cat;
} else if(isDog()){
    animal = new Dog;
} else if(isBird()) {
    animal = new Bird;
} else if(isCodeMonkey()) {
    animal = new CodeMonkey ;
} else {
    animal = new Alien;
}

// Syntax sugar > verbose
var animal =
    isCat() ? new Cat :
    isDog() ? new Dog :
    isBird() ? new Bird :
    isCodeMonkey() ? new CodeMonkey :
    new Alien;

animal instanceof Alien; // true

En una futura entrada vamos a seguir desentrañando las posibilidades que surgen del uso de estos operadores.

Leer más:



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Comment

You may use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>