Il y a deux différents façons de créer un objet vide en JavaScript:
var objectA = {}
var objectB = new Object()
Y a-t-il une différence dans la façon dont le moteur de script les gère? Y a-t-il une raison d'utiliser l'un sur l'autre?
De même, il est également possible de créer un tableau vide en utilisant une syntaxe différente:
var arrayA = []
var arrayB = new Array()
javascript
arrays
object
javascript-objects
new-operator
Jonas Pegerfalk
la source
la source
var objectA = {} var objectB = new Object()
il y a une troisième construction qui produira le même résultat:var objectC = Object.create(Object.prototype);
{}
et[]
utiliser à la{}
place denew Object()
. Utilisez[]
au lieu denew Array()
. Utilisez des tableaux lorsque les noms des membres sont des entiers séquentiels. Utilisez des objets lorsque les noms de membres sont des chaînes ou des noms arbitraires. sourcenew Object()
et{}
ne sont pas des objets tout à fait vides, ce sont des objets qui ont le Object.prototype. Vous pouvez utiliserObject.create(null)
pour un objet vraiment vide (au moins selon les documents mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )Réponses:
Objets
Il n'y a aucun avantage à utiliser
new Object();
- alors qu'il{};
peut rendre votre code plus compact et plus lisible.Pour définir des objets vides, ils sont techniquement les mêmes. le
{}
syntaxe est plus courte, plus nette (moins Java-ish), et vous permet de remplir instantanément l'objet en ligne - comme ceci:Tableaux
Pour les tableaux, il n'y a de même presque aucun avantage à utiliser
new Array();
Over[];
- à une exception près:crée un tableau de 100 éléments avec tous les emplacements contenant
undefined
- ce qui peut être agréable / utile dans certaines situations (comme(new Array(9)).join('Na-Na ') + 'Batman!'
).Ma recommandation
new Object();
- c'est plus maladroit que{};
et semble idiot.[];
- sauf lorsque vous devez créer rapidement un tableau "vide" avec une longueur prédéfinie.la source
new Array(100)
. Lisez la littérature: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…[]
. Aucun argument là-bas. Vous, cependant, avez soutenu quenew Array(100)
c'est en quelque sorte "invalide", ce qui est faux.new Array(1,2,3)
résultats en[1,2,3]
, maisnew Array(1)
ne pas entraîner[1]
; ainsi, la sémantique deArray
est incohérente et prête à confusion inutilement.Object.create(null)
peut être utile pour créer un objet vide, alors qu'il{ }
hérite du prototype d'objet.Oui, il y a une différence, ce ne sont pas les mêmes. Il est vrai que vous obtiendrez les mêmes résultats mais le moteur fonctionne de manière différente pour les deux. L'un d'eux est un objet littéral, et l'autre est un constructeur, deux façons différentes de créer un objet en javascript.
Dans JS, tout est un objet, mais vous devez être conscient de la chose suivante avec new Object (): il peut recevoir un paramètre, et en fonction de ce paramètre, il créera une chaîne, un nombre ou simplement un objet vide.
Par exemple
new Object(1)
:, renverra un nombre.new Object("hello")
retournera une chaîne, cela signifie que le constructeur d'objet peut déléguer - en fonction du paramètre - la création d'objet à d'autres constructeurs comme la chaîne, le nombre, etc ... Il est très important de garder cela à l'esprit lorsque vous gérez des données dynamiques à créer des objets ..De nombreux auteurs recommandent de ne pas utiliser le constructeur d'objet lorsque vous pouvez utiliser une certaine notation littérale à la place, où vous serez sûr que ce que vous créez est ce que vous attendez d'avoir dans votre code.
Je vous suggère de faire une lecture supplémentaire sur les différences entre la notation littérale et les constructeurs sur javascript pour trouver plus de détails.
la source
Ceux-ci ont le même résultat final, mais j'ajouterais simplement que l'utilisation de la syntaxe littérale peut aider à s'habituer à la syntaxe de JSON (un sous-ensemble de chaînes de syntaxe d'objet littéral JavaScript), il pourrait donc être une bonne pratique d'entrer dans .
Une autre chose: vous pourriez avoir des erreurs subtiles si vous oubliez d'utiliser l'
new
opérateur. Ainsi, l'utilisation de littéraux vous aidera à éviter ce problème.En fin de compte, cela dépendra de la situation ainsi que des préférences.
la source
La syntaxe littérale objet et tableau {} / [] a été introduite dans JavaScript 1.2, elle n'est donc pas disponible (et produira une erreur de syntaxe) dans les versions de Netscape Navigator antérieures à 4.0.
Mes doigts par défaut continuent de dire new Array (), mais je suis un très vieil homme. Heureusement, Netscape 3 n'est pas un navigateur que beaucoup de gens doivent considérer aujourd'hui ...
la source
est beaucoup plus rapide et, selon mon expérience, plus communément utilisé, il est donc préférable d'adopter le «standard» et d'économiser de la frappe.
la source
new Object
doivent être exécutés au moment de l'exécution.Je crois que cela a
{}
été recommandé dans l'une des vidéos Javascript ici comme une bonne convention de codage.new
est nécessaire pour l'héritage pseudoclassique. levar obj = {};
chemin permet de vous rappeler qu'il ne s'agit pas d'un langage classique orienté objet mais d'un langage prototypique. Ainsi, le seul moment dont vous auriez vraiment besoinnew
est lorsque vous utilisez des fonctions constructeurs. Par exemple:Ensuite, il est utilisé comme suit:
Un autre avantage à utiliser
{}
comme opposénew Object
est que vous pouvez l'utiliser pour faire des littéraux d'objet de style JSON.la source
Performances d'instanciation de la baie
Si vous souhaitez créer un tableau sans longueur:
var arr = [];
est plus rapide quevar arr = new Array();
Si vous souhaitez créer un tableau vide d'une certaine longueur:
var arr = new Array(x);
est plus rapide quevar arr = []; arr[x-1] = undefined
;Pour les repères, cliquez sur ce qui suit: https://jsfiddle.net/basickarl/ktbbry5b/
Je ne connais cependant pas l'empreinte mémoire des deux, je peux imaginer que cela
new Array()
prend plus de place.la source
arr = new Array(x)
équivaut àarr = []; arr.length = x;
ne pas affecter l'x-1
index avecundefined
.C'est essentiellement la même chose. Utilisez ce que vous trouvez plus pratique.
la source
Object
n'est-il pas nul, tandis que le {proto} de{}
est 'Object.prototype'?Object
est nul, c'est correct. C'est parce queObject
met fin à la chaîne de prototypes. Les instances d' objets n'ont cependant pas de prototype, seuls les constructeurs en ont un. Et(new Object()).constructor === ({}).constructor
->true
new Object()
donne une instance d'objet vide.{}
renvoie une instance d'objet vide. Ces deux cas sont absolument indiscernables. L'exemple auquel vous vous connectez fait autre chose (il modifie la chaîne du prototype) et ne s'applique pas vraiment ici - ou je ne comprends pas votre argument.OK , il n'y a que 2 façons différentes de faire la même chose! L'un appelé
object literal
et l'autre est une fonctionconstructor
!Mais lisez la suite, il y a quelques choses que je voudrais partager:
L'utilisation
{}
rend votre code plus lisible, tout en créant des instances deObject
ou d'autres fonctions intégrées non recommandées ...De plus, la fonction Object obtient des paramètres car c'est une fonction, comme
Object(params)
... mais{}
est un moyen pur de démarrer un objet en JavaScript ...L'utilisation du littéral objet rend votre code beaucoup plus propre et plus facile à lire pour les autres développeurs et il est conforme aux meilleures pratiques en JavaScript ...
Alors que Object en Javascript peut être presque n'importe quoi,
{}
ne pointe que vers des objets javascript, pour tester son fonctionnement, faites ci-dessous dans votre code javascript ou votre console:Étonnamment, cela crée un numéro!
Et cela crée un tableau!
et ce résultat bizarre pour
String
!Donc, si vous créez un objet, il est recommandé d'utiliser le littéral objet, d'avoir un code standard et d'éviter tout accident de code comme ci-dessus, également en termes de performances,
{}
c'est mieux selon mon expérience!la source