Blog ElCodiguero
30 ene 2010 Javascript

¿Javascript, o «script de Java»?

He escuchado demasiadas veces la frase script de Java referida a Javascript. Probablemente se trate de una mala traducción que desafortunadamente fue considerada correcta, pero la verdad es que escucharla de un ingeniero en sistemas me choca, y mucho. Saber que gente que sabe piensa que Javascript es simplemente un subconjunto de Java es muy frustrante. Por eso es mi intención ahora mismo nombrar alguna de las diferencias que se me vienen a la mente, simplemente para tenerlo como referencia la próxima vez que me toque explicarle a alguien por qué Javascript NO significa script de Java.

Exponer las diferencias entre Java y Javascript se ha hecho muchas veces antes, pero tengo la sensación de que la mayoría de las veces que se escribió sobre el tema se hizo siendo Javascript un lenguaje despreciado y considerado casi un juguetito de las páginas web. Javascript es mucho más que un Java básico y con algunas cosas raras, e intentaré hacer valer eso en este artículo.

Historia

Dejaré que Wikipedia mencione los detalles sobre la historia del lenguaje. Lo principal en esta historia es que el lenguaje que hoy conocemos como Javascript comenzó su vida llamándose LiveScript: el cambio de nombre fue únicamente (según algunos) para aprovechar la publicidad que se hacía en la época a Java y el impulso comercial que éste estaba teniendo.

Ejecución

Partiendo en ambos lenguajes de un código fuente válido, el proceso que sigue un programa en Java es bastante diferente al que sigue un programa en Javascript.

Java

Un programa Java se compila, generando un archivo .class por cada clase o un JAR que incluye todas las clases. Es la JVM (Máquina Virtual de Java) la que luego ejecuta el programa.

Javascript (en un navegador)

El código fuente Javascript se incluye en la página HTML mediante una etiqueta <script> o <link> en el caso de un archivo externo. El navegador interpreta el código y lo ejecuta en un entorno restringido a la página desde la cual es vinculado.

Sintaxis

Tanto Java como Javascript utilizan una sintaxis basada en la de C. Se podría decir que Java se parece más a C++, mientras que Javascript se parece más a C.

Tipos de datos

Java incluye los tipos de datos básicos integer (y derivados), String, boolean, float y double. Además, cada clase es un tipo de dato con el que podemos crear variables. Una variable de un tipo no puede redefinirse como de otro (a menos que otro sea superclase de uno), y se aplican comprobaciones estrictas de tipos. A esto se le llama tipado estático.

Javascript solamente posee los tipos de datos number, object, string, function. Las variables se definen sin tipo, serán del tipo que sea aquello que se les está asignando. A una variable definida de cierto tipo se le puede asignar un valor de otro tipo (por ejemplo, a una variable entera puede asignársele una cadena), y el tipo de dato de la variable cambia. A esto se le llama tipado dinámico. Veamos un par de ejemplos para ver la diferencia. Primero, código Java:

String variable = "Hola"; // variable se declara de tipo String
variable = 1; // dará un error de compilación, no se puede asignar un entero.

Y ahora un código equivalente en Javascript:

var variable = "Hola"; // variable se declara sin tipo. Como se le asigna una cadena, tendrá el tipo String
variable = 1; // variable es ahora de tipo entero. No hay errores

Ámbito de las variables

Java, al igual que la mayoría de los lenguajes basados en C, tiene variables de bloque. Es decir, que una variable definida en un bloque de código (delimitado por las llaves { y }) existirá solamente dentro de ese bloque. En caso de producirse ambigüedad (una variable local al bloque se llama igual que una variable externa) tiene prioridad el espacio de nombres local.

En Javascript, por otra parte, solamente las funciones generan su propio espacio de nombres. Los bloques de código utilizan las variables definidas fuera, y si definen alguna variable ésta no desaparecerá cuando el programa salga del bloque, sino que seguirá definida en el espacio de nombres global (o de la función en la que esté el bloque). Esto es algo bastante molesto en realidad, ya que puede fácilmente generar conflictos y es una de las principales razones (por si no hubiera ya suficientes) para evitar las variables globales.

Funcional

En java las funciones NO son un tipo de datos. En Javascript sí: una función es una variable como cualquier otra, que se puede pasar como parámetro a otra función o asignar a una variable. Incluso se pueden declarar funciones anónimas para utilizarlas una sola vez y que no ocupen el espacio de nombres. Se dice que una función es un tipo de dato de primera clase. Esto, junto con otras características, hacen que javascript pueda considerarse un lenguaje funcional, y, en palabras del experto Douglas Crockford, el primer lenguaje lambda en llegar a utilizarse masivamente. (donde lambda proviene del cálculo lambda, y es otro nombre para una función anónima.)

Orientación a Objetos

Java es orientado a objetos, como todos sabemos, y utiliza una orientación a objetos clásica, es decir, basada en clases. Los objetos son ejemplares de una clase (disculpen pero detesto utilizar instancia como traducción de instance), y la herencia se da entre clases.

Javascript es también orientado a objetos, pero no usa clases, aunque hay formas de simularlas y se utiliza algo similar a una clase al crear un objeto de tipo Date. En Javascript la herencia se da directamente entre objetos, mediante prototipos. Todo objeto contiene un atributo oculto que lo vincula a su objeto padre, formando una cadena hasta el objeto padre Object (que en los navegadores es window).

Un objeto hereda todos los métodos y atributos de su objeto padre, y si al objeto padre se le agrega un método o atributo, los objetos hijos podrán ver inmediatamente el nuevo miembro añadido. Todo objeto contiene un atributo prototype al que se puede agregar miembros (atributos o métodos) para que todos los objetos hijos puedan verlos. Por ejemplo, si agrega un método metodo a String.prototype, todas las cadenas contendrán el método.

Conclusión

Espero que este repaso por algunas de las principales diferencias entre Java y Javascript sirva de algo, con un poco de suerte estaré ayudando a que ya nadie piense en Javascript como un hermanito menor de Java. Para aquellos que quieran profundizar en el lenguaje, recomiendo los videos disponibles en el YUI Theater y el libro Javascript: The Good Parts de Douglas Crockford.

Activa Javascript para para cargar los comentarios, basados en DISQUS

El Blog de ElCodiguero funciona sobre Pelican

Inicio | Blog | Acerca de