2010-12-09 24 views
9

Je vois quatre cinq options pour initialiser un tableau à une longueur spécifique à JS, (la dernière est un étirement, je sais):Est un tableau (5) équivalent à var a = []; a.length = 5; en JS?

var a = []; a.length = 5; 

var a = Array(5); 

var a = []; a[4] = undefined; 

var a = new Array(5); 

function makeArrayToLength(length, default){ 
    var a = [], i = 0; 
    for(; i < length; i++){ 
     a[i] = default; 
    } 
    return a; 
} 

je veux vraiment (et faire) utiliser le littéral chaque fois que possible, mais je suis dans une situation où l'aspect définissant d'un tableau particulier est sa longueur, donc je me penche vers Array (5). Le premier exemple est-il équivalent au second en termes de résultat final? Je réalise que ce n'est pas équivalent dans l'exécution.

Répondre

8

Les deux premiers, et les troisième exemples sont équivalentes, à la fin, ils produisent un objet Array avec un seul propriété, length, contenant 5 comme valeur.

Lorsque vous appelez le constructeur Array en utilisant un seul argument numérique (comme Array(5);), l'objet nouvellement créé contiendra ce numéro comme sa propriété length, les propriétés de l'index ne sont pas créés:

var a = Array(5); 
a.hasOwnProperty('0'); // false 

le deuxième exemple produit la même chose:

var a = []; 
a.length = 5; 
a.hasOwnProperty('0'); // false 

a propos du troisième exemple, il est équivalent, car il va créer un prope rty sur l'objet de tableau, même si sa valeur est undefined:

var a = []; a[4] = undefined; 
a.hasOwnProperty('4'); // true 

Le quatrième exemple:

var a = new Array(5); 

Est-ce exactement le même que le second (var a = Array(5);), il n'y a pas de différence entre l'utilisation de la Array constructeur avec ou sans l'opérateur new, dans le deuxième exemple vous êtes calling the Array constructor as a function. Enfin, à propos de votre fonction makeArrayToLength, je pense que vous savez maintenant que ce n'est pas du tout équivalent puisque toutes les "propriétés d'index" sont initialisées à une valeur "par défaut". (BTW ne pas utiliser default comme identifiant, il est un mot-clé ...)

Le constructeur Array est généralement évitée car elle peut avoir des comportements différents selon l'argument utilisé, par exemple:

Array("5"); // one element array, (["5"]) 
Array(5); // empty array, length = 5 
// v.s. 
["5"]  // one element array 
[5]   // one element array 

En outre, le constructeur Array peut être remplacé, tandis que les littéraux de tableau fonctionneront toujours.

+0

vous savez que vous pourriez me jeter un sursaut si vous allez incorporer des morceaux de ma réponse dans le vôtre. – Hamish

+0

@Hamish, désolé mais je n'ai pas "incorporé des morceaux de votre réponse" dans le mien, je viens d'éditer pour étendre ma réponse (en fait je n'ai pas remarqué votre réponse jusqu'à ce que j'ai fini d'éditer), et ce n'est pas le premier temps [je parle d'appeler les constructeurs intégrés en tant que fonctions] (http://stackoverflow.com/search?q=user:5445+%22constructor+called+as+a+function%22) :), mais oui, je pense que ta réponse mérite un upvote ... – CMS

+0

Désolé s'il y avait un malentendu - pour une raison que je pensais que tu avais utilisé le même lien, mais qui aurait peut-être mal lu. Cette réponse est très approfondie :) – Hamish

2

Oui, ils produisent tous le même résultat.

2 et 4 sont les mêmes parce que, selon la ECMAScript spec:

15.4.1 Le constructeur Array appelé comme fonction est appelée lorsque matrice en fonction plutôt que comme un constructeur, il crée et initialise un nouvel objet Array . Ainsi la fonction appelle Array (...) est équivalent à l'objet création expression nouveau Array (...) avec les mêmes arguments.

1 et 2 sont équivalentes car [] construit un nouveau tableau et définissant la propriété de la longueur est équivalente à la construction d'un tableau avec new Array(length) (in the spec).

Option 3 est également équivalent parce que:

... chaque fois qu'une propriété est ajoutée dont le nom est un index de tableau, d'être un de plus que la valeur numérique la propriété de longueur est modifiée, le cas échéant, de cet index de tableau

Et l'option 5 est fondamentalement juste l'option 3, mais répétée plusieurs fois jusqu'à l'index maximum.

+0

+1, Notez simplement que * l'option 3 * n'est pas * strictement équivalente * en termes d'objet résultant (même si cela peut ne pas être important pour une utilisation pratique), car évidemment, une propriété nommée "4" est créée dans l'objet, alors qu'avec les autres options (1,2,4) cela n'arrive pas, la seule * propriété propre * sur l'objet résultant est "longueur", les "propriétés d'index" ne sont pas créées ... – CMS

+0

Ah, Merci pour la clarification. – Hamish