Secretos y Rarezas de JavaScript
| July 28, 2011 | Posted by Hakel under Javascript |
JavaScript es uno de los lenguajes de programación que más me gustan y que más me sorprenden día a día. Y así, como es fascinante, también tiene sus secretos y rarezas. Veamos algunas de ellas ![]()
Para empezar, debemos recordar, que JavaScript no es un lenguaje basado en Clases, sino basado en Prototipos, y un lenguaje basado en Prototipos tiene la noción de un objeto prototipo, un objeto utilizado como una plantilla de la cual se obtiene las propiedades iniciales para un nuevo objeto.
Si quieres leer más sobre las diferencias entre los lenguajes basados en clases frente a los basados en prototipos, lee este artículo
1. Null es un objeto ![]()
Todos sabemos que la definición de null es “la ausencia de un valor“. Pues bien, en JavaScript, null es un objeto. No lo crees, pruébalo:
1 | alert(typeof null); // 'object' |
A pesar de esto, null no se considera una instancia del objeto (prototipo) Object. Recordemos que en Javascript, los valores son instancias de objetos prototipos, por ejemplo, cada número es una instancia del objeto Number. Con esto, volvemos a la lógica, ya que siendo null la ausencia de un valor, entonces, no puede ser una instancia de un objeto.
Probemos con:
1 | alert (null instanceof Object); //false |
En conclusión, en JavaScript, null es un objeto, pero no es instancia de objeto prototipo.
2. NaN es un Número
Si el que Null sea un objeto te pareció extraño, ahora intenta pensar en que NaN es un número!, se que estarás pensando que NaN es acrónimo de “Not a Number” ¿cómo entonces es que en JavaScript es una instancia de Number?
Intenta:
1 | alert(typeof NaN); // 'Number' |
Y otra cosa, NaN no es considerado igual a sí mismo :-S
1 | alert(NaN === NaN); // false |
Así que, NaN no es igual a nada, por lo que la única manera de comprobar que algo es igual a NaN, es mediante la función isNaN();
3. replace() puede aceptar una función de retorno
Este es uno de los secretos mejor guardados de JavaScript (v1.3+).
La mayoría de programadores, estamos acostumbrados a usar replace() de la siguiente manera:
1 2 | alert('10 13 21 48 52'.replace(/\d+/g, '*')); //remplaza todos los números con '*' |
¿Qué pasa si queremos tener mayor control sobre los reemplazos que se quieren realizar?. Un ejemplo es reemplazar solo aquellos números máyores a 30. Esto, no lo podemos hacer solo con expresiones regulares. Probablemente, quienes se han enfrentado a esto, han realizado un split() sobre la cadena, y luego han recorrido con un ciclo el arreglo resultante para reemplazar las coincidencias, y después, seguramente, han usado un join() sobre el arreglo, para volver a tener una cadena.
Pues bien, esa larga historia, se puede resumir llamando a una función para evaluar cada coincidencia:
1 2 3 | alert('10 13 21 48 52'.replace(/\d+/g, function(match) { return parseInt(match) > 30 ? '*' : match; })); // 10 13 21 * * |
Por cada coincidencia, JavaScript llama nuestra función pasando como argumento nuestra coincidencia. Y devolverá ‘*’ si es mayor que 30 o el mismo argumento, en caso contrario.
4. Undefined puede definirse
A estas alturas de este post, ya has de tener un verdadero dolor de cabeza, pero también es cierto, que estarás sorprendido y quizá, se te hayan aclarado algunas dudas viejas.
Pues bien, para no hacer más largo este post, vayamos con esta idea “Undefined puede definirse”. Suena algo tonto, pero es cierto, y puede tener serias consecuencias.
Te sonará extraño (y yo aún no acabo de entenderlo), pero “undefined” no es una palabra reservada en JavaScript, a pesar de que su significado es especial, y a pesar de que es la única manera de determinar si una variable está o no definida.
Veamos:
var someVar;
1 | alert(someVar == undefined); //true |
Hasta aquí, todo normal ¿cierto?. Ahora:
1 2 3 | undefined = "I'm not undefined!"; var someVar; alert(someVar == undefined); //false |
Si aún así, no me crees que “undefined” no es una palabra reservada, lee esto
Y tú, ¿qué otros secretos de JavaScript conoces ?

Comentarios recientes