2009-04-01 51 views
6

Estoy buscando hacer una presentación en un par de semanas y me preguntaba: ¿Cuáles son las diez incompatibilidades Javascript más importantes que se tienen en cuenta al desarrollar? ¿Qué te hace tropezar? Puedo empezar con una:Incompatibilidades/Inconsistencias de Javascript

var somevar = { 
'internet': 'explorer', 
'hates': 'trailing', 
'commas': 'in', 
'json': 'code', // oh noes! 
} 

¿Cuáles son algunos otros errores comunes que no pueden o no corregidos por utilizar un framework como jQuery o base?

+0

¿Qué es el gotcha en el código de arriba? –

+0

La coma final (después de 'código') puede estar allí en algunos navegadores, no en otros. – Thilo

+0

Eso puede hacer tropezar a los desarrolladores de PHP que están aprendiendo JavaScript como yo, ya que me he acostumbrado a PHP siempre aceptando la última coma. – thomasrutter

Respuesta

3

var x = nuevo Boolean (falso); if (x) ... else ...;

¿Se toma la rama 'si' o 'más'?

var x = "hi", y = new String ("hi");

¿cuál es el tipo de (x) y typeof (y)?

Editar: ..

parseInt ("017") produce 15 (octal) en lugar de 17

El objeto 'Error' es una firma diferente de IE a Firefox.

Al usar objetos como hashmap, debe usar object.hasOwnProperty (clave) para asegurarse de que la propiedad no se hereda a través de la cadena de prototipos.

+1

Entonces, ¿dónde están las incompatibilidades de Javascript? –

+0

Si bien no son inconsistencias exclusivas entre los navegadores, esta respuesta proporciona la mayoría de las incoherencias en el lenguaje. – cgp

7

Con el formato HTML como

<div id="foo"> 
    <a href="#">Link 1</a> 
</div> 

Si usted obtiene una referencia a la div exterior, tendrá un nodo hijo en algunos navegadores, y tres nodos secundarios en otras, dependiendo de cómo se trata el espacio en blanco. Algunos tendrán nodos de texto con la nueva línea y espacios en blanco como secundarios de div#foo antes y después del elemento de enlace.

+0

Afortunadamente, esto es algo de lo que las bibliotecas como prototype.js se ocupan. – Thilo

+0

No estoy seguro de que ninguna biblioteca pueda manejar todas las situaciones, ya que el análisis de espacios en blanco en el DOM no es coherente en todos los navegadores, lo que creo que fue el punto. (hay una pérdida de datos que es imposible de reemplazar) Lo intentaré más tarde en algunos navegadores para verificar. – cgp

+0

Más un problema de DOM que uno de JS, aunque JS es bastante consistente sobre caminar a través del DOM – annakata

0

No hay casi inconsistencias en las implementaciones de JavaScript en los navegadores. Si lo hubiera, sería una pesadilla multiplicada (por las múltiples incoherencias en la implementación de DOM). Así que "Las diez incompatibilidades/incoherencias más importantes de Javascript" probablemente solo se puedan completar con "Bottom One" que haya detectado. De hecho, podría haber un par más, pero no esperaría que fueran importantes o que valgan la pena.

0

Inconsistencias de API DOM a un lado (que es lo que resuelven las bibliotecas), no hay muchas.

Pero algunos motores JS han implementado more features, como [] .map(), [] .filter() etc., instrucción let o E4X. Cuando cambio de desarrollo orientado a Mozilla (extensiones de Firefox, servidor con Jaxer) y desarrollo de navegador general (sitios web), necesito recordar qué hay disponible en cada navegador y qué no. Por lo tanto, se trata de que se implementa, no cómo se hace.

6

Bueno, hay un problema con los puntos y comas implícitos.

return { 
    a: 1, 
    b: 2 
} 

Algunas personas, como la apertura de los soportes en su propia línea, como este:

return 
{ 
    a: 1, 
    b: 2 
} 

Sin embargo, esta última afirmación volverá undefined, ya que el analizador ve:

return; 
{ 
    a: 1, 
    b: 2 
} 
+0

. Esa es una muy buena. – meandmycode

+1

¿Pero es una incompatibilidad? – reinierpost

+0

No, es más de un gotcha. Ya no hay muchas incompatibilidades en JS. El DOM es el culpable. – Magnar

2

Otro (no creo que esto viene muy a menudo):

(typeof document.getElementById) 

en IE: "objeto"

en Firefox: "función"

0

Para el objeto Date:

alert((new Date()).getYear(); 

Firefox devuelve 109

Internet Explorer devuelve 2009

0
alert(document instanceof Document) 

en Firefox: ¡cierto!

en Internet Explorer: excepción: Documento no está definido

0

Una extensión a punto de altCognito .. El elemento no es un tipo de base definido ya sea ...

//uses jQuery 
function getSomething(input) { 
    if (typeof(input) == string) 
     input = $(input)[0] || $('#'+input)[0] || null; 

    if (input instanceof Element) 
     input = $(input); 

    if (input instanceOf jQuery) { 
     ...do something... 
    } 
} 

tuviera que sustituir el elemento instanceOf con ..

if (input && input.tagName)... 

Sería bueno si los elementos DOM estuvieran adecuadamente clasificados en IE.