Pourquoi éviter de créer des objets en JavaScript?

Je suis en train de suivre un tutoriel JavaScript sur W3Schools. En lisant presque sur chaque page, ils donnent note à l'utilisateur de "Éviter de créer des objets" et d'utiliser plutôt des types de données primitives. Ils donnent une raison pour que «le code devienne difficile à comprendre ou la vitesse d'exécution diminue si l'objet est utilisé». Est-il vrai que nous devrions éviter de créer des objets en JavaScript?

Par exemple:

var value = new Number(1); // Avoid this var value = 1; // do something like this instead. 

La déclaration "éviter de créer des objets" est absurde en JavaScript, qui a des objets partout et est l'une des langues les plus orientées vers l'objet. Mais "éviter de créer des versions d'objets de primitives", c'est ce que le code que vous citez, est valide. C'est-à-dire, éviter une new String , un new Number et un new Boolean .

JavaScript a à la fois des versions primitive et objet de chaînes, de nombres et de booléens. Il n'y a presque jamais de raison de créer explicitement la version d'objet de l'une d'entre elles, ce qui peut entraîner de la confusion; Voir les commentaires en ligne:

 var s1, s2, n1, n2; // These are false because with ===, an object is never equal to a non-object s1 = new String("hi"); s2 = "hi"; console.log(s1 === s2); // false n1 = new Number(42); n2 = 42; console.log(n1 === n2); // also false // These are false because even with ==, two *different* objects are never equal // (even if they're equivalent) s1 = new String("what the..."); s2 = new String("what the..."); console.log(s1 == s2); // also false n1 = new Number(42); n2 = new Number(42); console.log(n1 == n2); // also false 

Cela change la façon intuitive dont les opérateurs se comportent avec des nombres, des chaînes et des booleans:

  • La comparaison stricte ( === ) se casse lorsque l'un des nombres est construit, donc 42 === 42 est vrai, tandis que 42 === new Number(42) n'est pas,
  • La comparaison abstraite ( == ) se casse lorsque les deux nombres sont des objets, donc 42 == new Number(42) est vrai, tandis que le new Number(42) == new Number(42) n'est pas,
  • typeof opérateur typeof donne un résultat différent lorsqu'un nombre est construit, donc typeof(42) est le number , mais typeof(new Number(42)) est un object ,
  • Lorsqu'il est converti en booléen, 0 est faux, mais le new Number(0) est vrai, donc les deux suivants auront un comportement différent:
 var a = 0; if (a) console.log("not zero"); else console.log("zero!"); // "zero!" var b = new Number(0); if (b) console.log("not zero"); // "not zero" else console.log("zero!");