298 votes

JavaScript `new Array(n) " et " Tableau.le prototype.la carte " étrangeté

J'ai observé cela dans Firefox 3.5.7/Firebug-1.5.3 et Firefox 3.6.16/Firebug-1.6.2

Quand j'ai le feu jusqu'à Firebug:

    >>> x = new Array(3)
    [undefined, undefined, undefined]
    >>> y = [undefined, undefined, undefined]
    [undefined, undefined, undefined]

    >>> x.constructor == y.constructor
    true

    >>> x.map(function(){ return 0; })
    [undefined, undefined, undefined]
    >>> y.map(function(){ return 0; })
    [0, 0, 0]

Ce qui se passe ici? Est-ce un bug, ou suis-je l'incompréhension comment utiliser new Array(3)?

153voto

David Mårtensson Points 4300

Il semble que le premier exemple

x = new Array(3);

Crée un tableau avec undefined pointeurs.

y = [undefined, undefined, undefined]

Et le second crée un tableau avec des pointeurs vers 3 indéfini d'objets, dans ce cas, les pointeurs eux-même ne sont PAS non défini, seuls les objets qu'ils pointent.

Comme la carte est exécuté dans le contexte des objets dans le tableau, je crois que la première carte ne peut pas exécuter la fonction tandis que le second parvient à exécuter.

32voto

Jonathan Lonowski Points 45253

À partir de la MDC page pour map:

[...] callback n'est invoquée que pour les index de la table qui ont affecté la valeur; [...]

[undefined] s'applique en fait le setter de l'index(es) de sorte qu' map va se répéter, alors qu' new Array(1) seulement initialise l'index(es) avec une valeur par défaut de undefined donc map l'ignore.

Je crois que c'est la même pour toutes les méthodes d'itération.

23voto

Tim Down Points 124501

Les tableaux sont différents. La différence est que, new Array(3) crée un tableau avec une longueur de trois, mais pas de propriétés, tandis que l' [undefined, undefined, undefined] crée un tableau avec une longueur de trois et de trois propriétés appelée "0", "1" et "2", chacune avec une valeur de undefined. Vous pouvez voir la différence à l'aide de l' in opérateur:

"0" in new Array(3); // false
"0" in [undefined, undefined, undefined]; // true

Cela provient de la légèrement à confusion fait que si vous essayez d'obtenir la valeur d'une propriété qui n'existe pas du tout natif objet en JavaScript, il retourne undefined (plutôt que de jeter une erreur, comme il arrive quand vous essayez de consulter un inexistante variable), qui est le même que ce que vous obtenez si le bien a déjà été explicitement définie à l' undefined.

7voto

helloandre Points 5784

Je pense que la meilleure façon d'expliquer cela est de regarder la façon Chrome poignées.

>>> x = new Array(3)
[]
>>> x.length
3

Donc ce qui se passe réellement est que new Array() retourne un tableau vide qui a une longueur de 3, mais pas de valeurs. Par conséquent, lorsque vous exécutez x.map sur un techniquement tableau vide, il n'y a rien à régler.

Firefox juste "remplit" de ces logements vides avec undefined , même si elle n'a pas de valeurs.

Je ne pense pas que cela soit explicitement un bug, juste une mauvaise façon de représenter ce qui se passe. Je suppose que google Chrome est "plus correct", car il montre qu'il n'y a pas réellement de quoi que ce soit dans la matrice.

6voto

Pointy Points 172438

Pas un bug. C'est ainsi que le constructeur Array est défini à travailler.

De MDC:

Lorsque vous spécifiez un seul paramètre numérique de la gamme du constructeur, vous spécifiez la longueur initiale de la matrice. Le code suivant crée un tableau de cinq éléments:

var billingMethod = new Array(5);

Le comportement du constructeur Array dépend si le paramètre est un nombre.

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