15 de Enero, 2012

Problemas con Javascript

Una de las (¡muchas!) cosas que no me gustan de Javascript es que no parece haber suficiente consistencia entre las diferentes implementaciones que encontramos en los navegadores.

No es nada positivo cuando los detalles del lenguaje te distraen de lo que estás programando, pero ¿qué pasa cuando una funcionalidad se comporta de forma distinta dependiendo del navegador?

Por ejemplo, en el trabajo tuve que pelear con un bug bastante complicado de localizar porque hay características de substr que no están disponibles en la implementación de Microsoft Internet Explorer.

Al final un x.substr(-1) se debe expresar x.substr(x.length-1), o no será portable. Algo que debes de saber y solo da la experiencia, y que convierte a una funcionalidad en inútil (a no ser que no quieras soportar IE, claro :P).

Ah, pero no siempre es IE el problemático. Aquí hay otro caso, para el que incluso di de alta un bug para Firefox:

// constructor usando milisegundos
var a=new Date(0);

// ¿cuál es el resultado? :D
console.log(a.getHours() + ", " + a.getMinutes() + ", " + a.getSeconds());

El resultado en Firefox es 1, 0, 0 mientras que en Chromium/Chrome es 0, 0, 0.

La vedad es que la explicación no es nada sencilla, pero Firefox es el que muestra el resultado correcto: el segundo 0 corresponde con 00:00h UTC del 1 de Enero de 1970, y como mi huso horario es Europa/Londres, en ese día se aplicaba el horario de verano y... la hora era 1am y no medianoche.

Al final con usar los métodos UTC (por ejemplo, getUTCHours), el problema se soluciona y podemos seguir adelante con nuestro trabajo... y mejor no pensar en el tiempo perdido :).

Actualización: parece que mi informe de error ha sido aceptado y hay un problema en la implementación de Firefox :).

Anotación por Juan J. Martínez, clasificada en: javascript.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: