Je préconise de faire une introduction sur le JavaScript et, dans le processus de préparation, je me demandais quels sont les pièges les plus élevés dans lesquels se situent les recrues.
Je sais que j'ai eu quelques contraintes avant que je comprenne complètement la fermeture, mais une grande partie du comportement étrange de JavaScript n'est plus un sujet dont je pense …
Alors, quels pièges devriez-vous signaler aux novices?
Conversion de type booléen .
'' == '0' //false 0 == '' //true 0 == '0' //true false == 'false' //false false == '0' //true false == undefined //false false == null //false null == undefined //true " \t\r\n" == 0 //true
En plus de la différence entre null
et undefined
. Comme indiqué dans le tableau ci-dessus, la comparaison de null
& undefined
avec ==
renvoie true, mais avec ===
il renvoie false. Ce comportement est logique une fois que vous comprenez que undefined
est très différent d'une variable ayant une valeur null
, et quelque chose qui détient la valeur undefined
est différent de ce qui est indéfini.
Ne laissez pas accidentellement une virgule arrière dans une définition d'objet littérale ou IE échouera et vous ne remarquerez pas beaucoup plus tard parce que vous n'utilisez jamais IE pour le développement et que d'ici là, vous pourriez imaginer ce qui s'est passé.
var foo = { bar: "bar", baz: "baz", };
Note @ Commentaire de JulianR: Dans les tableaux, IE ne manque pas directement en lançant une erreur de syntaxe, mais échouera lorsque vous essayez d'utiliser le tableau car la virgule ajoutée fait IE penser qu'il y a un élément de plus dans le tableau, avec une valeur undefined
, que Il y a effectivement. Donc, si vous avez déjà une erreur car, pour une raison quelconque, le dernier élément d'un tableau est undefined
: c'est une virgule.
Certes, j'ai été coupable de certains dans le passé, pour votre amusement, ce sont les audacieux:
eval
eval("obj."+prop);
with
instructions parseInt(str, base)
sans préciser l'argument de base
. this
dans les fonctions timer / callback. setTimeout("someFunc(myScopedVarWhoops)");
$(1).plus(1)
quiconque? 😉 continue
sans incrémenter ou ajuster la variable conditionnelle. var
dans ou avant for
déclarations. for (i=0;i<10;i++)
return condition ? true : false;
return condition ? true : false;
Au lieu de la return condition;
de return condition;
try...catch...finally
statements to catch errors au lieu d'utiliser les instructions if
pour vérifier les variables. { 0: "Foo", 1:"Bar", 2:"Foobar" }
au lieu de [ "Foo", "Bar", "Foobar" ]
parseInt()
sur l'entrée de l'utilisateur
parseInt("1,000") // -> 1, wrong! +"1,000" // -> NaN, correct!
Certains ont déjà mentionné:
===
) chaque fois que possible ;
Terminer correctement les déclarations for...in
boucles sur des tableaux Peut penser un peu plus après avoir dormi 🙂
var
+
Concaténer des chaînes:
var a = '2'; var b = 3; a * b # 6 a - b # -1 a + b # 23
Les chaînes JavaScript ne sont pas des chaînes d'octets, ni même des chaînes Unicode. Ils sont des chaînes UTF-16.
Exemple:
> "♫".length 1 > "𐌈".length 2 > "𐌈".charAt(0) "\uD800" > "𐌈".charAt(1) "\uDF08" > "𐌈" === "\uD800\uDF08" true
Si ce qui précède ressemble à des ordures, reprochez à votre navigateur de manipuler unicode buggy (ou éventuellement votre police, pour ne pas avoir le caractère 'OLD ITALIC LETTER THE').
Les plus grandes difficultés que je vois pour le débutant sont la compréhension du contexte d'exécution (c.-à-d. Ce que «cela» signifie à chaque fois et partout où il se trouve) et le prototype de système d'héritage.
Je ne peux plus penser, mais j'espère que cela vous aidera.
window.onload = init();
Au lieu de window.onload = init;
for in
variante for in
boucle pour l'itération sur les Arrays. ;
Parce que c'est "facultatif". this
(juste … en général :)) var
obj.ref === obj["ref"]
Tout le concept de prototypage prend un certain temps pour comprendre complètement, mais voici quelques pièges communs:
Oublier de réinitialiser la propriété constructeur après avoir assigné un prototype d'objet:
var Foo() = function () { this.batz = '...'; }; Foo.prototype = new Bar(); Foo.prototype.constructor = Foo;
Si vous oubliez la moindre ligne, le new Foo()
exécutera actuellement Bar()
.
Un autre piège avec le prototypage est itérer sur des objets / tableaux sans filtrer les membres du prototype:
for (var i in obj) { if (obj.hasOwnProperty(i)) { //stuff... } }
La condition supplémentaire sautera les membres qui sont hérités du prototype d' obj
.
Pas un piège de codage réel, mais plus une réflexion générale:
Ne faites pas confiance à ce que votre JavaScript fait, il aurait pu être éteint ou même corrigé par un singe . Cela signifie que vous ne comptez jamais sur la validation côté client. JAMAIS.
typeof null is object >>> var i = 1 + undefined; i; NaN >>> var i = 1 + null; i; 1