Quelles sont les bonnes pratiques à suivre lors de la déclaration d'un tableau en Javascript?


176

Quand j'ai besoin de déclarer un nouveau tableau, j'utilise cette notation

var arr = new Array();

Mais lors des tests en ligne, par exemple sur jsbin , un avertissement me signale "Utiliser la notation littérale du tableau []".

Je n'ai pas trouvé de raison d'éviter d'utiliser le constructeur. Est-ce en quelque sorte moins efficace que l'utilisation []? Ou est-ce une mauvaise pratique?

Y a-t-il une bonne raison d'utiliser à la var arr = [];place de var arr = new Array();?


5
Les deux vont bien. Vous économisez simplement quelques octets lors de la transmission.
Sirko

13
Il y a effectivement des différences. Voir cet article: stackoverflow.com/q/2280285/921204
techfoobar

Remarque: il existe des différences si Array a été écrasé uniquement.
crdx

@apkd sur certains navigateurs, il y a une différence de performance significative
Alnitak

C'est suffisant. Je n'ai pas vu cela sur la question liée.
crdx

Réponses:


260

Surtout , les gens utilisent var a = []parce que Douglas Crockford le dit .

Ses raisons incluent le comportement non intuitif et incohérent de new Array():

var a = new Array(5);     // an array pre-sized to 5 elements long
var b = new Array(5, 10); // an array with two elements in it

Notez qu'il n'y a aucun moyen new Array()de créer un tableau avec un seul élément numérique pré-spécifié!

L'utilisation []est en fait plus efficace et plus sûre ! Il est possible d'écraser le Arrayconstructeur et de lui faire faire des choses étranges, mais vous ne pouvez pas écraser le comportement de [].

Personnellement, j'utilise toujours la []syntaxe, et de la même manière, j'utilise toujours la {}syntaxe à la place de new Object().


5
"vous ne pouvez pas écraser le comportement de []." Es-tu sûr de ça? J'ai pensé que vous pourriez écraser le constructeur Array pour affecter [], et le constructeur Object pour affecter {}, au moins sur certaines implémentations.
Random832

11
@ Random832 peut-être dans les navigateurs plus anciens, mais pas dans les implémentations compatibles ES5, où la spécification dit que cela []appelle un constructeur interne, quelle que soit la valeur qui Array.constructorse trouve à ce moment-là.
Alnitak

5
Bonus: les littéraux de tableau sont beaucoup plus rapides que la création de nouveaux tableaux à l'aide du Arrayconstructeur: jsperf.com/new-array
Mathias Bynens

@MathiasBynens seulement parfois.
OrangeDog

Ew @ the [] fonctionne différemment à cause du constructeur interne. L'incohérence causera plus de confusion qu'elle n'en sauve. Edit: Ah, problème de sécurité. J'ai compris.
Erik Reppen

48

Une différence importante est que []sera toujours instancier un nouveau tableau, alors que new Arraypourrait être pris en otage pour créer un objet différent .

(function () {
    "use strict";
    var foo,
        bar;
    //don't do this, it's a bad idea
    function Array() {
        alert('foo');
    }
    foo = new Array();
    bar = [];
}());​

Dans mon exemple de code, j'ai gardé la Arrayfonction cachée du reste de la portée du document, mais il est plus probable que si vous rencontrez un jour ce type de problème, le code n'aura pas été laissé dans une belle fermeture, et le sera probablement difficile à localiser.

Avertissement : ce n'est pas une bonne idée de détourner le Arrayconstructeur.


7
IIRC, dans les navigateurs plus anciens, le remplacement du constructeur Array entraînerait également une interprétation incorrecte des littéraux. Il y avait une vulnérabilité GMail CSRF il y a quelque temps qui impliquait de surcharger le constructeur de tableau et les nouveaux navigateurs ignorent la surcharge des littéraux pour cette raison précise.
hugomg

Contre-avertissement: il a cependant été extrêmement utile et utile d'améliorer le constructeur Array au fil des ans.
Erik Reppen

26

pour la maintenabilité, utiliser []

Le littéral du tableau est plus prévisible, car la plupart des développeurs l'utilisent. La plupart des tableaux utilisent le littéral, et il est intéressant de faire correspondre votre code avec ce que les autres développeurs utilisent.

pour les tableaux vides, utilisez []

var ns = [];
var names = [ 'john', 'brian' ];

Comme indiqué ici , utiliser le littéral pour empty et quelques éléments connus est plus gros que le constructeur Array.

pour un tableau de taille connue, utilisez new Array(size)

Si la taille est connue, l'utilisation du constructeur Array améliore considérablement les performances. Cependant, cela signifie également que vous devez gérer un tableau qui a déjà «indéfini» remplissant toutes ses valeurs.

Comme montré ici

// fill an array with 100 numbers
var ns = new Array( 100 );
for ( var i = 0; i < 100; i++ ) {
    ns[i] = i;
}

Cela fonctionne également pour les très petits tableaux .


12

Non, il n'y a en fait aucune raison d'utiliser une notation plutôt qu'une autre pour les tableaux vides.

Cependant, la plupart des navigateurs affichent des performances légèrement meilleures en utilisant x = [];que d'appeler le constructeur .

Si vous devez créer un tableau avec une taille spécifique, vous sorte de besoin d'utiliser , x = new Array(10);par exemple, ce qui créerait un tableau avec 10 undefinedemplacements.


@Alnitak: que vous avez déjà mentionné, n'est pas très intuitif et concis.
jAndy

7
J'ai assemblé un jsperf pour comparer les performances: jsperf.com/array-constructor-versus-literal . Au moins pour moi sur Chrome 20 sur Ubuntu, le littéral est deux fois plus rapide que le constructeur.
Steven


jAndy, pourquoi voudriez-vous un tableau avec "10 emplacements vides" en JavaScript? En réalité, vous pouvez faire exactement la même chose avec: var arr = []; arr [9] = "oméga"; 1. Les tableaux dans JS sont totalement dynamiques, vous pouvez référencer n'importe quel index de votre choix, et il sera simplement "indéfini". C'est tout aussi vrai que si vous disiez: var arr = new Array (10); arr [23]; 2. la longueur du tableau va être définie sur la valeur la plus élevée qui contient quelque chose, quel que soit le nombre d'emplacements non définis entre les deux. Ou vous pouvez le définir vous-même. [] pourrait ne pas guérir le cancer, mais il est légèrement meilleur.
Norguard

7
  • var arr = [] utilise le littéral tableau / objet
  • var arr = new Array () utilise le constructeur de tableau / objet

La manière la plus rapide de définir un tableau ou un objet est la manière littérale, car vous n'avez pas besoin d'appeler le constructeur

var arr1 = new Array(1, 2, 3, 4);
var arr2 = [1, 2, 3, 4];

alert(arr1[0]); // 1
alert(arr2[0]); // 1

var arr3 = new Array(200);
var arr4 = [200];

alert(arr3[0]); // 'undefined'
alert(arr4[0]); // 200

2
Pour référence, dans les coulisses, var arr = [];utilise aussi logiquement un constructeur. C'est juste toujours le constructeur de tableau intégré, plutôt que n'importe quelle fonction actuellement nommée Array.
cHao

6

Les deux sont corrects seulement. Mais la plupart des gens utilisentvar a = []

Trois façons de déclarer un tableau en JavaScript.

méthode 1 : Nous pouvons explicitement déclarer un tableau avec le mot-clé JavaScript "new" pour instancier le tableau en mémoire (c'est-à-dire le créer et le rendre disponible).

// Declare an array (using the array constructor)
var arlene1 = new Array();
var arlene2 = new Array("First element", "Second", "Last");

méthode 2 : nous utilisons une méthode alternative pour déclarer les tableaux.

// Declare an array (using literal notation)
var arlene1 = [];
var arlene2 = ["First element", "Second", "Last"];

méthode 3 : JavaScript vous permet également de créer des tableaux indirectement, en appelant des méthodes spécifiques.

// Create an array from a method's return value
var carter = "I-learn-JavaScript";
var arlene3 = carter.split("-");

4

Il y a une limite que le constructeur peut prendre comme arguments.

Sur la plupart des systèmes que j'ai rencontrés, la limite est de 2 ^ 16 (2 octets):

var myFreshArr = new Array(0,1,2,3 ..... 65536);

Cela provoquera une erreur (trop d'arguments ....)

Lorsque vous utilisez le littéral [], vous n'avez pas de tels problèmes.

Au cas où vous ne vous souciez pas de ces grands tableaux, je pense que vous pouvez utiliser ce que vous préférez.


2
Pouvez-vous citer un exemple où une personne pourrait raisonnablement vouloir créer un tableau pré-rempli avec 70 000 valeurs? Cependant, cela explique vraiment certains des horribles sites Web que j'ai vus qui ne semblent jamais finir de se charger ...
John O

2
John O, j'ai vu des implémentations SCARY JSON à mon époque, impliquant des tableaux de tableaux 2D / 3D, avec des codes IATA (aéroport), des compagnies aériennes, des voyagistes, des complexes hôteliers, etc. dans un seul tableau. C'est ... ... 1 Mo + les téléchargements JSON me donnent envie de pleurer.
Norguard

4
var array = [ 1, 2, 3, 4];

est du sucre

var array = new Array(1, 2, 3, 4);

est du sel


5
et où l'utiliser, pour le café ou pour les pâtes?
Aristos

sucre syntaxique et sel
linquize

3

C'est parce que new Array()c'est ambigu. Voici les bons constructeurs:

// Using brackets
[element0, element1, ..., elementN]

// Using new AND a list of elements
new Array(element0, element1, ..., elementN)

// Using new AND an integer specifying the array length
new Array(arrayLength)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.