Inicio > JavaScript, Libros > Review: Professional JavaScript for Web Developers, Capítulo 3 (Parte II)

Review: Professional JavaScript for Web Developers, Capítulo 3 (Parte II)

Seguimos con el review del capítulo tres. Le toca el turno a los operadores, sentencias y funciones.

El estándar describe un conjunto de operadores que podemos usar para manipular los datos de una variable. Cualquiera con conocimiento de un lenguaje de programación conoce los operadores matemáticos básicos, como la suma (+), resta (-), multiplicación (*), división(/) y módulo(%), por lo que los operadores matemáticos me los voy a saltar, al igual que los de desplazamiento de bits, más que nada por no alargar mucho el review del capítulo.

OPERADORES.

Operadores Incremento y Decremento

Los operadores de incremento y decremento se utilizan para añadir o restar uno a un valor numérico. Estos operadores no sólo trabajan con enteros, pueden trabajar con cadenas, booleanos, valores de coma flotante y objetos a través de la coerción de tipos:

  • Cuando se utilizan con una cadena que tiene una representación de un número, convierte el número y aplica el cambio.
  • Cuando se utiliza con una cadena que no tiene una representación válida de un número, la variable coge el valor NaN.
  • Cuando se utiliza con un valor booleano false, convierte el valor a cero y aplica el cambio.
  • Cuando se utiliza con un valor booleano true, convierte el valor a uno y aplica el cambio.
  • Cuando se usa con un valor de coma flotante, añade o resta uno.
  • Cuando se usa con un objeto, llama al método valueOf() o para coger un valor con el que trabajar. Aplica las otras reglas. Si el resultado es NaN, llama al método toString() y vuelve a aplicar las reglas otra vez.

En todo caso, la variable se convierte a un valor numérico.

var edad = 23;
edad++;
alert(edad); //24
Operadores booleanos

Como todo lenguaje de programación, ECMAScript cuenta con un conjunto de operadores booleanos.

El operador NOT (!) niega el valor de un booleano; sino se utiliza un booleano, primero se convierte y después lo niega. Aquí puede entrar en juego la coerción de los demás tipos de datos a un booleano, por ejemplo, si aplicamos el operador NOT a un valor null, nos devolverá true. Esto es así porque el valor null se evalúa como false, y el operador NOT, niega el valor convirtiéndolo en true.

var encontrado = false;
alert(!encontrado); //true;

El operador AND (&&) se aplica a dos valores y devuelve true si los dos valores booleanos son true; con que un valor se evalúe a false, el operador AND devuelve false. El operador AND puede utilizarse con cualquier tipo de datos, no solo valores booleanos; pero hay que tener en cuenta que si uno de los dos valores no es un booleano no siempre devolverá un booleano. Por ejemplo, si uno de los dos operadores es null, undefined o NaN, el operador AND devolverá null, undefined o NaN en cada caso.

var encontrado = true;
var ultimo = true;
alert(encontrado && ultimo); //true

El operador OR (||) se aplica a dos valores y devuelve true si algún valor es true; solo devuelve false cuando los dos valores se evalúan a false. Al igual que el operador AND, puede que no devuelve un booleano si alguno de los dos valores no es un booleano. Con valores como null, NaN y undefined se comporta de la misma manera. Pero tiene algunas cosas importantes a destacar. Por ejemplo, si el primer valor es un objeto, entonces se devuelve ese objeto. Si el primer valor se evalúa a false, entonces se devuelve el segundo valor. Y si ambos valores son objetos, se devuelve el primero.

Debido a este comportamiento, se suele utilizar el operador OR para establecer valores por defecto a las variables:

var objeto = objetoPreferido || objetoPorDefecto;

De esta forma, se evaluará objetoPreferido primero; y si se evalúa a false (si la variable contiene null), se devolverá el segundo operando, el objetoPorDefecto.

Operadores relacionales

Los operadores relaciones comparan valores, menor que (<), menor o igual que (<=), mayor que (>), mayor o igual que (>=). Cada uno de estos operadores devuelve un valor booleano, true si se cumple la condición, false si no se cumple.

Algunas cosas importantes a destacar, si los dos operadores son números se hace una comparación numérica. Si los dos valores son strings, se comparan carácter a carácter. Si algún valor es un objeto, se llama al método valueOf() para obtener un valor con el que trabajar. Si valueOf() no está disponible se llama al método toString(), es decir, aplica la coerción de tipos para convertir un objeto en su equivalente booleano.

alert(5>3); //true
alert(a>b); //false
Operadores de igualdad

Existen dos tipos de operadores de igualdad en ECMAScript. Tenemos por un lado el operador de igualdad == que devuelve true si los dos operados son iguales, y desigualdad != que devuelve true si los dos operandos son distintos. Pero estos operadores permiten comparar tipos de datos distintos ya que se tiene en cuenta la coerción de tipos para compararlos.

Algunas cosas a tener en cuenta:

  • Si un operando es un valor Boolean, lo convierte en un valor numérico siguiendo las reglas que vimos, 1 es el equivalente a true y 0 el equivalente a false.
  • Si un operando es un string y el otro es un número, se convierte el string en su equivalente numérico.
  • Si uno de los operandos es un objeto, se invoca al método valueOf() para coger un valor primitivo con el que trabajar, si valueOf() no está disponible se invoca el método toString().
  • Los valores null y undefined son iguales.
  • Si uno de los operandos es NaN se devuelve false con el de igualdad y true con el de desigualdad. Si los dos valores son NaN se devuelve false con el operador de igualdad porque NaN no es equivale a Nan.
  • Si los dos operadores son objetos, se comparan para ver si son el mismo objeto, es decir, si ambos apuntan al mismo objeto. Si son objetos iguales pero no apuntan a la misma dirección de mmoria devuelve false.

Tabla de ejemplos extraída del libro:

null == undefined true
“NaN” == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
“5” == 5 true

Por otro lado tenemos los operadores idénticamente iguales === y idénticamente desiguales !== que funcionan de manera similar al anterior pero sin ejercer la coerción de datos. Es decir no compara tipos diferentes, el operador de idénticamente igual siempre devolverá false si evalúa operandos de distinto tipo.

Un ejemplo que muestra la diferencia más importante con las conversiones de tipo:

55 === "55" false
55 == "55" true

La verdad, es un lío el tema de la coerción de tipos en ECMAScript, pero con la práctica no es muy difícil entender como funciona el mecanismo de conversiones.

Sentencias

Esta parte del capítulo describe las sentencias para controlar el flujo de la aplicación; tanto condicionales (if…else, switch), como repetitivas, (while, do-while, for, for-in, etc). Vamos a ver algunas cosas interesantes sobre estas estructuras.

Las condiciones no hacen falta que sean booleanos, como en la mayoría de lenguajes orientados a objetos, ya que automáticamente se transforma a un booleano utilizando la función casting Boolean(). La estructura for-in se utiliza para recorrer todas las propiedades de un objeto. Las propiedades de un objeto no tienen orden, por lo que no se puede predecir en que pasada se utilizará cada propiedad del objeto.

for(var propiedad in objeto){
   ....
}

Las palabras reservadas break y continue tienen la misma función que en los demás lenguajes. La palabra break obliga a salir del bucle, continue salta a la siguiente pasada del bucle.

La sentencia with se utiliza para establecer el ámbito del código  en un objeto en concreto.  Si tenemos el siguiente código para acceder a la URL de la página:

var url = location.href;

Utilizando with con el ámbito en el objeto location, podemos utilizar sus propiedades sin referirnos al objeto location:

with(location){
var url = href;
}

El autor del libro no recomienda utilizar esta sentencia porque tiene un impacto negativo de rendimiento y dificulta la depuración del código encerrado dentro de la sentencia.

La sentencia switch compara los valores con el operador de igualdad idéntica, por lo que no se produce ningún tipo de casting o coerción de tipos. Además en los case podemos utilizar cualquier expresión, sin necesidad de utilizar ninguna constante.

Funciones

Las funciones en JavaScript no tienen mucho que ver con la de otros lenguajes de programación.

  • Devueven undefined si no especificamos un valor a devolver.
  • No se preocupan de cuantos argumentos pasemos. Definir una función con dos argumentos no significa que solo podamos pasarle dos argumentos. Esto es así porque los argumentos de una función vienen representados como un array internamente. Pero hay que tener en cuenta que los argumentos que hayamos definido valdrán undefined si no los pasamos.
  • Podemos acceder a los argumentos de una función a través del objeto arguments que actúa como un array (podemos obtener el número de argumentos a través de la propiedad length de arguments), aunque realmente no es una instancia de Array.
  • Todos los argumentos se pasan por valor, no por referencia.
  • No existe la sobrecarga de funciones como en otros lenguajes de programación. Si se definen dos funciones con el mismo nombre se tiene en cuenta la última, aunque el número de argumentos sea diferente.
About these ads
Categorías:JavaScript, Libros
  1. Tun
    19 septiembre, 2011 en 13:00 | #1

    Muy interesante.
    Gracias por compartirlo, ya me he subscrito a tu RSS.

  1. Aún no hay trackbacks

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 64 seguidores

%d bloggers like this: