La déclaration "d'éviter de créer des objets" est absurde en JavaScript, ce qui a des objets partout et est l'un des la plupart des langages orientés objet dans l'existence. Mais "éviter de créer des versions d'objets de primitives", qui est ce que le code que vous citez, est valide. C'est, d'éviter new String
, new Number
, et new Boolean
.
JavaScript a la fois primitive et les versions d'objets de chaînes de caractères, nombres, et les booléens. Il n'y a presque jamais aucune raison de créer la version de l'objet de l'un d'eux de manière explicite, et cela peut en effet conduire à 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
L'objet de versions de chaînes de caractères, nombres, et les booléens largement existent pour permettre à des méthodes sur des primitives pour être fournis en utilisant le même mécanisme qui fournit des méthodes pour les types d'objet. Lorsque vous ne
console.log("foo".toUpperCase()); // "FOO"
un objet temporaire est créé pour la primitive de la chaîne "foo"
, puis l' toUpperCase
propriété est en lecture à partir de cet objet. Depuis l'objet hérite String.prototype
, il a toUpperCase
et tout est bien. Une fois l'opération terminée, l'objet temporaire est jeté (à moins que quelque chose maintient une référence vers elle, mais rien n'est et ne peut rien avec toUpperCase
, vous devez ajouter une méthode à l' String.prototype
renvoyé l'objet dans l'ordre pour qu'il soit maintenu autour).