941 votes

Quelle est la différence entre "Array ()" et "[]" lors de la déclaration d'un tableau JavaScript?

Quelle est la vraie différence entre déclarer un tableau comme ceci:

 var myArray = new Array();
 

et

 var myArray = [];
 

1054voto

nickf Points 185423

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:

 x = new Array(5);
alert(x.length); // 5
 

Pour illustrer les différentes façons de créer un tableau:

 var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = new Array(3),   // e.length == 3, e[0] == undefined
    f = [3]             // f.length == 1, f[0] == 3
;
 

808voto

coderjoe Points 4240

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

var a = [];

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:

var a = new Array();

Vous avez dit l'interprète, je tiens à appeler le constructeur de la "Matrice" 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.

Prenons l'exemple suivant:

function Array() {
    this.is = 'SPARTA';
}

var a = new Array();
var b = [];

alert(a.is);  // => 'SPARTA'
alert(b.is);  // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)

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 le "push", où l'autre ne fonctionne pas.

Alors que vous pouvez vous attendre à ce que cela arrive, il illustre simplement le fait que les "[] "n'est pas la même que la" new 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...

Cheers!

55voto

galambalazs Points 24393

Assez curieusement, 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 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 donnée, l'amélioration des performances est perdue.

44voto

BarelyFitz Points 1196

Pour plus d'informations, la page suivante explique pourquoi vous ne devez jamais utiliser new Array():

http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/

Vous ne devez jamais utiliser new Object() dans Le JavaScript. Utilisation de l'objet littéral {} au lieu de cela. De même, n'utilisez pas de nouvelles Array(), utilisez le littéral de tableau [] au lieu de cela. Les tableaux en JavaScript travail rien de tel que les tableaux en Java, et l'utilisation de Java comme de la syntaxe vous confondre.

N'utilisez pas de nouveau Numéro, la nouvelle Chaîne, ou nouvelle valeur de type Boolean. Ces formes produire inutile de l'objet de la demande. Utilisez simplement simple littéraux de la place.

Découvrez également les commentaires - le new Array(longueur) de la forme n'a pas d'utilité (au moins aujourd'hui, dans les implémentations de JavaScript).

5voto

Kholio Points 61

Je peux expliquer de façon plus spécifique en commençant par cet exemple est basé sur Fredrik est bon.

var test1 = [];
test1.push("value");
test1.push("value2");

var test2 = new Array();
test2.push("value");
test2.push("value2");

alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);

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

JS traite test1 comme une VARIABLE avec un type de données de tableau, et il traite test2 comme un OBJET avec la fonctionnalité d'un tableau, et il y a quelques légères différences.

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 Matrice de() la fonction, puis il stocke nos "pousser"les valeurs dans sa "Valeur" des biens, et la même chose arrive quand nous alerte test2, il renvoie la "Valeur" de la 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X