Quelle est la différence entre “Array()” et “ []”, tout en déclarant un tableau JavaScript?
Quelle est la réelle différence entre le fait de déclarer un tableau comme ceci:
var myArray = new Array();
et
var myArray = [];
[]
jeton:ARRAY_INIT
;new Array
des jetons:NEW, IDENTIFIER
;new Array()
des jetons:NEW, IDENTIFIER, CALL
Vous devez vous connecter pour publier un commentaire.
Il y a une différence, mais il n'y a pas de différence dans cet exemple.
À l'aide de la méthode plus détaillée:
new Array()
n'ont une option supplémentaire dans les paramètres: si vous passez un numéro pour le constructeur, vous obtiendrez un tableau de cette longueur:Pour illustrer les différentes façons de créer un tableau:
Une autre différence est que lors de l'utilisation de
new Array()
vous êtes en mesure de définir la taille de la matrice, ce qui affecte la taille de la pile. Cela peut être utile si vous avez des débordements de pile (Les performances de la pile.push vs Tableau.unshift) qui est ce qui se passe lorsque la taille du tableau dépasse la taille de la pile, et il doit être re-créé. Donc, il peut en effet, suivant le cas, une augmentation des performances lors de l'utilisation denew Array()
parce que vous pouvez empêcher le débordement de passe.Comme l'a souligné dans cette réponse,
new Array(5)
ne sera pas réellement ajouter cinqundefined
des éléments dans le tableau. Il suffit d'ajouter de l'espace de cinq éléments. Être conscient que l'utilisation deArray
de cette façon rend difficile de s'appuyer surarray.length
pour les calculs.===
peut être source de confusion pour le profane - en particulier, les tests serait faux parce qu'ils sont pas en comparant le même objet. Ils peuvent être indiscernables, mais ils ne sont pas égal.new Array()
il est possible de définir la taille de la pile sur la création. Sinon, le tableau devra être recréé dans la mémoire lorsque les débordements de pile. Voir stackoverflow.com/a/44032020/930998 pour une explication élaborée.La différence entre la création d'un tableau avec le tableau implicite et le constructeur array est subtile mais importante.
Lorsque vous créez un tableau à l'aide
Vous avez dit à l'interprète de créer un nouveau runtime tableau. Pas de traitement supplémentaire nécessaire à tous. Fait.
Si vous utilisez:
Vous racontez l'interprète, je tiens à appeler le constructeur "
Array
" et de générer un objet. Il se penche ensuite par le biais de votre contexte d'exécution de trouver le constructeur à appeler, et qu'il appelle, de la création de votre tableau.Vous pouvez penser "eh Bien, ce n'est pas grave du tout. Ils sont les mêmes!". Malheureusement, vous ne pouvez pas garantir que.
Prendre l'exemple suivant:
Dans l'exemple ci-dessus, le premier appel d'alerte "SPARTA", comme vous le souhaitez. La seconde ne sera pas. Vous allez voir de undefined. Vous noterez aussi que b contient tous les natifs de l'objet de Tableau de fonctions telles que
push
, où l'autre ne fonctionne pas.Alors que vous pouvez vous attendre à ce que cela arrive, il illustre simplement le fait que
[]
n'est pas le même quenew Array()
.Il est probablement préférable d'utiliser
[]
si vous savez que vous voulez juste un tableau. J'ai aussi ne suggèrent pas aller autour de la redéfinition et de la Matrice de...new Array(n)
créer un tableau tandis que[]
est une liste (tableau dynamique)?Il existe une différence importante qu'aucune réponse n'a encore été mentionnée.
De:
Vous pourriez penser que le
new Array(2)
est équivalent à[undefined, undefined]
, mais il n'est PAS!Essayons
map()
:Voir? La sémantique est totalement différent! Alors, pourquoi est-ce?
Selon ES6 Spec 22.1.1.2, le travail de
Array(len)
est juste la création d'un nouveau tableau dont la propriétélength
est définie à l'argumentlen
et qui, par conséquent, il n'est pas tout élément réel à l'intérieur de ce tableau nouvellement créé.Fonction
map()
, selon les spec 22.1.3.15 serait tout d'abord de vérifierHasProperty
ensuite appeler la fonction de rappel, mais il s'avère que:Et c'est pourquoi vous ne pouvez pas attendre tout de l'itération des fonctions de travail comme d'habitude sur les tableaux créés à partir de
new Array(len)
.BTW, Safari et Firefox ont une bien meilleure "l'impression" de cette situation:
J'ai déjà présenté une question de Chrome et de leur demander de corriger cette confusion de l'impression:
https://bugs.chromium.org/p/chromium/issues/detail?id=732021
Mise à JOUR: Il est déjà fixé. Chrome maintenant imprimés comme:
[...Array(2)]
qui est équivalent à[undefined, undefined]
à partir d'un point de vue des résultats.undefined
comme d'habitude.Curieusement,
new Array(size)
est presque 2x plus rapide que[]
dans Chrome, et environ le même dans FF et IE (mesurée par la création et le remplissage d'un tableau). Il importe seulement si vous connaissez la taille approximative de l'éventail. Si vous ajoutez plus d'éléments que la longueur que vous avez donné, le gain de performances est perdu.Avec plus de précision:
Array(
est rapide et constante de temps de l'opération qui alloue pas de mémoire, wheras[]
est un temps linéaire opération qui définit le type et la valeur.new Array(length)
sur 0 <= taille <= ~1000, de la taille > ~1000 victoires[]
Pour plus d'informations, la page suivante explique pourquoi vous ne devez jamais utiliser
new Array()
Découvrez également les commentaires - le
new Array(length)
formulaire ne sert aucun but utile (au moins aujourd'hui, dans les implémentations de JavaScript).Afin de mieux comprendre
[]
etnew Array()
:Le résultat ci-dessus est à partir de Google Chrome console sur Windows 7.
Array(3)
ounew Array(3)
n'est pas le même que[3]
.La première est la valeur par défaut du constructeur d'objet de l'appel. Vous pouvez utiliser les paramètres si vous le souhaitez.
Le second vous donne la possibilité de créer pas de tableau vide:
var array = [5]
à l'aide de crochets, mais pas en utilisant le constructeur commevar array = Array(5)
fait un tableau vide de 5 éléments.[1,2,3,4,5]
est presque aussi rapide quenew Array(5)
, et c'est uniquement de la préparation de votre espace de stockage... Voir la jsperf.com/array-instanciation/2 et lire la cas de test avant de se plaindre, en bas de la moitié est de ne pas faire les mêmes choses que supérieure la moitié des tests, il y a aussi des affectations de valeur sur les trois derniers cas.Je peux expliquer de façon plus spécifique en commençant par cet exemple est basé sur Fredrik est bon.
J'ai juste ajouté une autre valeur, les tableaux, et fait quatre alertes:
La première et la seconde sont pour nous donner de la valeur stockée dans chaque tableau, pour être sûr de les valeurs. Ils seront de retour le même!
Essayez maintenant de la troisième, elle retourne false, c'est parce que
La première différence, c'est quand nous appelons test1 il appelle une variable sans réfléchir, elle retourne les valeurs qui sont stockées dans cette variable, en négligeant son type de données!
Mais, quand nous appelons test2 il appelle la Array() la fonction, puis il stocke nos "Poussé" valeurs dans son "Valeur" de la propriété, et la même chose arrive quand nous alerte test2, il retourne la "Valeur" propriété de l'objet array.
Ainsi, lorsque nous vérifions si test1 est égal à test2 bien sûr, ils ne reviendront jamais à la vraie, est une fonction, et l'autre est une variable (avec un type de tableau), même si elles ont la même valeur!
Pour être sûr à ce sujet, essayez le 4ème alerte, avec le .la valeur ajoutée; il retournera true. Dans ce cas, nous dire JS "le Mépris du type du conteneur, si c'était de la fonction ou variable, veuillez comparer les valeurs qui sont stockés dans chaque conteneur et dites-nous ce que vous avez vu!" c'est exactement ce qui se passe.
J'espère que je l'ai dit, l'idée que clairement, et désolé pour mon mauvais anglais.
[]
etnew Array()
est identique;.value
seraundefined
dans les deux cas, et en les comparant sera toujours faux.array.value
. et les deuxtypeof []
ettypeof new Array()
retourobject
. C'est une des raisons pour lesquelles il y a une fonction appeléeArray.isArray
Il n'y a pas de différence lors de l'initialisation d'une matrice, sans aucune longueur. Donc
var a = []
&var b = new Array()
est le même.Mais si vous initialiser le tableau avec la longueur comme
var b = new Array(1);
, il va mettre en objet de tableau de longueur 1. De sorte que son équivalent àvar b = []; b.length=1;
.Cela va être problématique lorsque vous ne array_object.pousser, ajouter l'élément suivant le dernier élément & augmenter la longueur.
vs
La première est la valeur par défaut du constructeur d'objet de l'appel.principalement utilisé pour des valeurs dynamiques.
le deuxième tableau est utilisé lors de la création de valeurs statiques
Il n'y a pas de grande différence, ils se sont contentés de faire la même chose, mais le faire de différentes manières, mais à lire, regarder cette déclaration au W3C:
et
Mais en même temps, créant un nouveau tableau à l'aide de
new Array
syntaxe considéré comme une mauvaise pratique:Donc, fondamentalement, n'est pas considéré comme la meilleure pratique, il y a aussi une différence mineure de là, vous pouvez passer à longueur de
new Array(length)
comme ça, qui a également pas une méthode recommandée.new Array(40).fill(123)
La différence de l'aide
Ou
A été discuté assez dans cette question.
Je voudrais ajouter la question de vitesse - le actuelle la façon la plus rapide, sur
google chrome
est la seconde.Mais attention, ces choses ont tendance à changer beaucoup de choses avec les mises à jour. Aussi, le temps d'exécution diffèrent entre les différents navigateurs.
Par exemple - la 2ème option que je l'ai mentionné, fonctionne à 2 millions de dollars [ops/seconde] sur
chrome
, mais si vous voulez l'essayer surmozilla dev.
vous obtenez un étonnamment taux plus élevé de 23 millions de dollars.De toute façon, je serais vous suggère de vérifier, une fois de temps en temps, sur différents navigateurs (et machines), à l'aide de site en tant que tel
Que je sais que la diference u peut trouver de la tranche(ou les autres funcitons de Tableau) comme code1.et code2 montrer u Tableau et son instances:
code1:
code2:
conclusion:
que u peut voir
[]
etnew Array()
créer une nouvelle instance de Array.Et ils ont tous le prototype des fonctions deArray.prototype
Ils sont juste différents instance de Array.donc, ce qui explique pourquoi
[] != []
🙂
J'ai engagés dans un comportement bizarre à l'aide de [].
Nous avons Modèle des "classes" avec des champs initialisés à une valeur. E. g.:
J'ai constaté que lorsque les champs sont initialisés avec
[]
ensuite, il serait partagée par tous les objets de Modèle. Apporter des modifications à l'un affecte tous les autres.Cela n'arrive pas à s'initialiser avec
new Array()
. Même pour l'initialisation des Objets ({}
vs newObject()
)TBH je ne suis pas sûr si c'est un problème avec le cadre, nous avons été à l'aide de (Dojo)
Il n'y a plus que rencontre l'oeil. La plupart des autres réponses sont correctes MAIS AUSSI..
new Array(n)
n
éléments[1, 2, 3] || []
delete
ou[1,,3]
syntaxe)for ..
,forEach
,map
, etc)J'ai trouvé une différence entre les deux constructions qui peu m'est très difficile.
Disons que j'ai:
Dans la vraie vie, si je fais ceci:
J'arrive à la fin est: est-ce
Je ne sais pas ce que le langage de spécification est censé se produire, mais si je veux que mes deux objets ont la propriété unique des tableaux dans mes objets, je dois utiliser
new Array()
.[]
etnew Array()
constructeur résultant en un point par tableau par propriété. Vous devez avoir quelque chose d'autre se passe dans votre code à la fin avec le résultat que vous montrer ci-dessus.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
À l'aide de la Matrice de constructeur fait un nouveau tableau de la longueur désirée et remplit chacun des indices est pas défini, la affecté à un tableau à une variable on crée les indices que vous donner les infos pour.