Javascript Incompatibilités / Incohérences

Je cherche à faire une présentation dans quelques semaines et je me demandais: quelles sont les dix meilleures incompatibilités Javascript que vous recherchez lors du développement? Qu'est-ce qui vous déplace? Je peux commencer par un:

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

Quels sont d'autres pièges communs qui ne peuvent pas ou ne sont pas corrigés en utilisant un framework comme jQuery ou base?

Var x = new boolean (false); Si (x) … autrement …;

La branche 'if' ou 'else' est-elle prise?

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

Quel est le type de (x) et le type de (y)?

Modifier:..

ParseInt ("017") produit 15 (octal) au lieu de 17

L'objet 'Erreur' est une signature différente d'IE vers Firefox.

Lorsque vous utilisez des objets comme hashmap, vous devez utiliser object.hasOwnProperty (clé) pour vous assurer que la propriété n'est pas héritée par la chaîne prototype.

Avec le marquage HTML comme

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

Si vous obtenez une référence à la div extérieure, il aura un nœud enfant dans certains navigateurs et trois nœuds enfants dans d'autres, selon la façon dont les espaces sont traités. Certains auront des nœuds de texte avec la nouvelle ligne et les espaces blancs comme enfants de div#foo avant et après l'élément de lien.

Eh bien, il y a un problème avec les points-virgules implicites.

 return { a: 1, b: 2 } 

Certaines personnes aiment ouvrir des crochets sur sa propre ligne, comme ceci:

 return { a: 1, b: 2 } 

Cependant, cette dernière déclaration renverra undefined , puisque l'analyseur voit:

 return; { a: 1, b: 2 } 

Un autre (ne pense pas que cela arrive très souvent):

 (typeof document.getElementById) 

Dans IE: "objet"

Dans Firefox: "fonction"

Il n'y a presque aucune incohérence dans les implémentations JavaScript dans les navigateurs. S'il y avait, ce serait un cauchemar multiplié (par les multiples incohérences dans la mise en œuvre de DOM). Donc, "Top Ten Javascript Incompatibilities / Inconsistencies" peut probablement seulement être rempli avec "Bottom One" que vous avez repéré. En effet, il pourrait y avoir une paire de plus, mais je m'attends à ce qu'ils soient majeurs ou mérite une attention particulière.

Les désagréments de l'API DOM à part (ce que les bibliothèques résolvent), il n'y en a pas beaucoup.

Mais certains moteurs JS ont implémenté plus de fonctionnalités , comme [] .map (), [] .filter () etc, let statement ou E4X. Lorsque je change de développement ciblé par Mozilla (extensions Firefox, côté serveur avec Jaxer) et développement général (sites Web), je dois me souvenir de ce qui est disponible dans tous les navigateurs et ce qui ne l'est pas. Il s'agit donc de ce qui est implémenté, et non de la manière dont il est fait.

Encore un autre:

Expressions régulières de Firefox vers IE, il y a beaucoup d'incohérences:

Pour la description: http://blog.stevenlevithan.com/archives/cross-browser-split

Il publie une version fixe de l'objet RegEx et une page de test: http://stevenlevithan.com/demo/split.cfm

Pour l'objet Date:

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

Firefox retourne 109

Internet Explorer retourne 2009

 alert(document instanceof Document) 

Dans Firefox: vrai!

Dans Internet Explorer: exception: le document est indéfini

Une extension à altCognito's point .. L'élément n'est pas un type de base défini non plus …

 //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... } } 

J'ai dû remplacer l'instanceOf Element avec ..

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

Serait bon si les éléments DOM étaient correctement classés dans IE tout autour.