Quelle est la vraie différence entre déclarer un tableau comme celui-ci:
var myArray = new Array();
et
var myArray = [];
javascript
arrays
declaration
Amr Elgarhy
la source
la source
[]
jeton:ARRAY_INIT
;new Array
jetons:NEW, IDENTIFIER
;new Array()
jetons:NEW, IDENTIFIER, CALL
Réponses:
Il y a une différence, mais il n'y a pas de différence dans cet exemple.
En utilisant la méthode plus verbeuse:
new Array()
a une option supplémentaire dans les paramètres: si vous passez un nombre au 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 lorsque
new Array()
vous utilisez, vous pouvez définir la taille du tableau, ce qui affecte la taille de la pile. Cela peut être utile si vous obtenez des débordements de pile ( Performances d'Array.push vs Array.unshift ), ce qui se produit lorsque la taille du tableau dépasse la taille de la pile, et il doit être recréé. Il peut donc en fait, selon le cas d'utilisation, augmenter les performances lors de l'utilisationnew Array()
car vous pouvez empêcher le débordement de se produire.Comme indiqué dans cette réponse ,
new Array(5)
n'ajoutera pas réellement cinqundefined
éléments au tableau. Il ajoute simplement de l'espace pour cinq éléments. Sachez que l'utilisation deArray
cette méthode rend difficile la fiabilitéarray.length
des calculs.la source
La différence entre la création d'un tableau avec le tableau implicite et le constructeur du tableau est subtile mais importante.
Lorsque vous créez un tableau à l'aide de
Vous dites à l'interpréteur de créer un nouveau tableau d'exécution. Aucun traitement supplémentaire nécessaire. Terminé.
Si tu utilises:
Vous dites à l'interprète, je veux appeler le constructeur "
Array
" et générer un objet. Il recherche ensuite dans votre contexte d'exécution pour trouver le constructeur à appeler et l'appelle, créant votre tableau.Vous pouvez penser "Eh bien, cela n'a pas d'importance du tout. Ce sont les mêmes!". Malheureusement, vous ne pouvez pas garantir cela.
Prenons l'exemple suivant:
Dans l'exemple ci-dessus, le premier appel alertera «SPARTA» comme prévu. Le second ne le sera pas. Vous finirez par voir indéfini. Vous remarquerez également que b contient toutes les fonctions natives de l'objet Array telles que
push
, là où l'autre ne le fait pas.Bien que vous puissiez vous attendre à ce que cela se produise, cela illustre simplement le fait que ce
[]
n'est pas la même chose quenew Array()
.Il est probablement préférable d'utiliser simplement
[]
si vous savez que vous voulez juste un tableau. Je ne suggère pas non plus de faire le tour et de redéfinir Array ...la source
Il y a une différence importante qu'aucune réponse n'a encore mentionnée.
De ceci:
Vous pourriez penser que le
new Array(2)
est équivalent à[undefined, undefined]
, mais ce n'est PAS!Essayons avec
map()
:Voir? La sémantique est totalement différente! Alors pourquoi ça?
Selon la spécification ES6 22.1.1.2, le travail de
Array(len)
consiste simplement à créer un nouveau tableau dont la propriétélength
est définie sur l'argumentlen
et c'est tout, ce qui signifie qu'il n'y a aucun élément réel à l' intérieur de ce tableau nouvellement créé.La fonction
map()
, selon la spécification 22.1.3.15 vérifierait d'abordHasProperty
puis rappellerait , mais il s'avère que:Et c'est pourquoi vous ne pouvez pas vous attendre à ce que les fonctions d'itération fonctionnent comme d'habitude sur les tableaux créés à partir de
new Array(len)
.BTW, Safari et Firefox ont une bien meilleure "impression" dans cette situation:
J'ai déjà soumis un problème à Chromium et je leur demande de corriger cette impression déroutante: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
MISE À JOUR: C'est déjà corrigé. Chrome désormais imprimé comme:
la source
[...Array(2)]
ce qui est équivalent[undefined, undefined]
du point de vue des résultats.undefined
comme d'habitude.Curieusement, il
new Array(size)
est presque 2x plus rapide que[]
dans Chrome, et à peu près le même dans FF et IE (mesuré en créant et en remplissant un tableau). Cela n'a d'importance que si vous connaissez la taille approximative du tableau. Si vous ajoutez plus d'éléments que la longueur que vous avez indiquée, l'augmentation des performances est perdue.Plus précisément: il
Array(
s'agit d'une opération à temps constant rapide qui n'alloue aucune mémoire, tandis qu'il[]
s'agit d'une opération à temps linéaire qui définit le type et la valeur.la source
new Array(length)
sur 0 <= taille <= ~ 1000, sur la taille> ~ 1000 victoires[]
Pour plus d'informations, la page suivante explique pourquoi vous n'avez jamais besoin d'utiliser
new Array()
Consultez également les commentaires - le
new Array(length)
formulaire ne sert à rien (au moins dans les implémentations actuelles de JavaScript).la source
Afin de mieux comprendre
[]
etnew Array()
:Le résultat ci-dessus provient de la console Google Chrome sur Windows 7.
la source
Array(3)
ou différentesnew Array(3)
de[3]
.Le premier est l'appel par défaut du constructeur d'objet. Vous pouvez utiliser ses paramètres si vous le souhaitez.
Le second vous donne la possibilité de créer un tableau non vide:
la source
var array = [5]
utilisant les crochets mais pas en utilisant le constructeur car celavar array = Array(5)
fait un tableau vide de 5 éléments.Je peux expliquer d'une manière plus spécifique en commençant par cet exemple qui est basé sur le bon de Fredrik.
Je viens d'ajouter une autre valeur aux tableaux, et j'ai fait quatre alertes: La première et la seconde doivent nous donner la valeur stockée dans chaque tableau, pour être sûr des valeurs. Ils reviendront les mêmes! Maintenant, essayez le troisième, il renvoie faux, c'est parce que
La première différence est que lorsque nous appelons test1, il appelle une variable sans réfléchir, il renvoie simplement les valeurs qui sont stockées dans cette variable sans tenir compte de son type de données! Mais, lorsque nous appelons test2, il appelle la fonction Array () , puis il stocke nos valeurs "Pushed" dans sa propriété "Value" , et il en va de même lorsque nous alertons test2, il renvoie la propriété "Value" de l'objet tableau.
Ainsi, lorsque nous vérifions si test1 est égal à test2, bien sûr, ils ne retourneront jamais vrai, l'un est une fonction et l'autre est une variable (avec un type de tableau), même s'ils ont la même valeur!
Pour en être sûr, essayez la 4ème alerte, avec la valeur ajoutée. cela reviendra vrai. Dans ce cas, nous disons à JS "Sans tenir compte du type de conteneur, que ce soit une fonction ou une variable, veuillez comparer les valeurs stockées dans chaque conteneur et dites-nous ce que vous avez vu!" c'est exactement ce qui se passe.
J'espère que j'ai clairement dit l'idée derrière cela, et désolé pour mon mauvais anglais.
la source
[]
etnew Array()
est identique;.value
seraundefined
dans les deux cas, et les comparer sera toujours faux.array.value
. et les deuxtypeof []
ettypeof new Array()
revenirobject
. C'est l'une des raisons pour lesquelles il existe une fonction appeléeArray.isArray
Il n'y a aucune différence lorsque vous initialisez un tableau sans aucune longueur. Donc
var a = []
&var b = new Array()
c'est pareil.Mais si vous initialisez un tableau avec une longueur comme
var b = new Array(1);
, il fixera la longueur de l'objet tableau à 1. Donc son équivalent àvar b = []; b.length=1;
.Ce sera problématique chaque fois que vous faites array_object.push, il ajoute un élément après le dernier élément et augmente la longueur.
contre
la source
Le premier est le constructeur d'objet par défaut call.mostly utilisé pour les valeurs dynamiques.
le deuxième tableau est utilisé lors de la création de valeurs statiques
la source
Il n'y a pas de grande différence, ils font essentiellement la même chose mais les font de différentes manières, mais lisez la suite, regardez cette déclaration au W3C:
et
Mais en même temps, créer un nouveau tableau en utilisant une
new Array
syntaxe considérée comme une mauvaise pratique:Donc, fondamentalement, ce n'est pas considéré comme la meilleure pratique, il y a aussi une différence mineure, vous pouvez passer la longueur à
new Array(length)
aimer cela, ce qui n'est pas non plus recommandé.la source
new Array(40).fill(123)
La différence d'utilisation
Ou
Comme cela a été suffisamment discuté dans cette question.
Je voudrais ajouter le problème de vitesse - le moyen le plus rapide actuellement ,
google chrome
c'est le deuxième.Mais faites attention, ces choses ont tendance à changer beaucoup avec les mises à jour. De plus, le temps d'exécution variera entre les différents navigateurs.
Par exemple - la 2ème option que j'ai mentionnée, fonctionne à 2 millions [ops / seconde]
chrome
, mais si vous l'essayez,mozilla dev.
vous obtiendrez un taux étonnamment plus élevé de 23 millions.Quoi qu'il en soit, je vous suggère de le vérifier, de temps en temps, sur différents navigateurs (et machines), en utilisant le site en tant que tel
la source
Comme je sais que la diference u peut trouver la tranche (ou les autres funcitons de Array) comme code1 .and code2 afficher u tableau et ses instances :
code1:
code2:
conclusion:
comme vous pouvez voir
[]
etnew Array()
créer une nouvelle instance de Array. Et ils obtiennent tous les fonctions prototypes deArray.prototype
Ce ne sont que des instances différentes de Array, ce qui explique pourquoi
[] != []
:)
la source
J'ai eu un comportement étrange en utilisant [].
Nous avons des «classes» de modèle avec des champs initialisés à une certaine valeur. Par exemple:
J'ai trouvé que lorsque les champs sont initialisés avec,
[]
ils seraient partagés par tous les objets Model. Apporter des modifications à l'un affecte tous les autres.Cela ne se produit pas en les initialisant avec
new Array()
. Idem pour l'initialisation des objets ({}
vs newObject()
)TBH Je ne sais pas si c'est un problème avec le framework que nous utilisions ( Dojo )
la source
Il y a plus que cela à l'œil nu. La plupart des autres réponses sont correctes MAIS AUSSI ..
new Array(n)
n
éléments[1, 2, 3] || []
delete
ou la[1,,3]
syntaxe)for ..
,forEach
,map
, etc.)la source
J'ai trouvé une différence entre les deux constructions qui me mordait assez fort.
Disons que j'ai:
Dans la vraie vie, si je fais ça:
Je me retrouve avec ceci:
Je ne sais pas ce que la spécification de langage dit censé se produire, mais si je veux que mes deux objets aient des tableaux de propriétés uniques dans mes objets, je dois utiliser
new Array()
.la source
[]
et dunew Array()
constructeur, ce qui donne un élément par tableau par propriété. Vous devez avoir quelque chose d'autre en cours dans votre code pour vous retrouver avec le résultat que vous montrez ci-dessus.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
L'utilisation du constructeur Array crée un nouveau tableau de la longueur souhaitée et remplit chacun des indices avec undefined, le tableau affecté à une variable crée les indices pour lesquels vous lui donnez des informations.
la source