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.
vous savez que vous pourriez me jeter un sursaut si vous allez incorporer des morceaux de ma réponse dans le vôtre. – Hamish
@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
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