Autrement dit, si j'utilise l'heure actuelle comme index dans le tableau:
array[Date.getTime()] = value;
l'interpréteur instanciera-t-il tous les éléments de 0 à maintenant? Les différents navigateurs le font-ils différemment?
Je me souviens qu'il y avait un bogue dans le noyau AIX , qui créait des pseudo-ttys sur demande, mais si vous faisiez, disons, "echo> / dev / pty10000000000" il créerait / dev / pty0, / dev / pty1, .... puis tomber mort. C'était amusant lors des salons, mais je ne veux pas que cela arrive à mes clients.
Réponses:
La manière exacte dont les tableaux JavaScript sont implémentés diffère d'un navigateur à l'autre, mais ils reviennent généralement à une implémentation clairsemée - probablement la même que celle utilisée pour l'accès aux propriétés des objets normaux - si l'utilisation d'un tableau réel serait inefficace.
Vous devrez demander à quelqu'un ayant plus de connaissances sur les implémentations spécifiques de répondre à ce qui déclenche le passage de dense à clairsemé, mais votre exemple doit être parfaitement sûr. Si vous voulez obtenir un tableau dense, vous devez appeler le constructeur avec un argument de longueur explicite et espérer que vous en aurez un.
Voir cette réponse pour une description plus détaillée par olliej.
la source
foo = new Array(10000)
. Toutefois, cela est censé fonctionner:foo = Array.apply(null, {length: 10});
.Oui, ils sont. Ce sont en fait des tables de hachage en interne, vous pouvez donc utiliser non seulement de grands entiers, mais également des chaînes, des flottants ou d'autres objets. Toutes les clés sont converties en chaînes via
toString()
avant d'être ajoutées au hachage. Vous pouvez le confirmer avec un code de test:Affiche:
Remarquez comment j'ai utilisé la
for...in
syntaxe, qui ne vous donne que les indices réellement définis. Si vous utilisez lefor (var i = 0; i < array.length; ++i)
style d'itération le plus courant , vous aurez évidemment des problèmes avec les index de tableau non standard.la source
length
propriété magiquelength
n'est invisible que dans lesfor..in
boucles car il a leDontEnum
drapeau défini; dans ES5, l'attribut de propriété est appeléenumerable
et peut être défini explicitement viaObject.defineProperty()
String
; tout ce que vous mettez en indice esttoString()
validé. Combinez cela avec l'imprécision entière d'un grand nombre et cela signifie que si vous définisseza[9999999999999999]=1
,a[10000000000000000]
sera 1 (et bien d'autres comportements surprenants). L'utilisation de non-entiers comme clés est très imprudente et les objets arbitraires sont tout à fait appropriés.Vous pouvez éviter le problème en utilisant une syntaxe javascript conçue pour ce genre de chose. Vous pouvez le traiter comme un dictionnaire, mais la syntaxe "for ... in ..." vous permettra de les saisir tous.
la source
Les objets Javascript sont rares et les tableaux ne sont que des objets spécialisés avec une propriété de longueur auto-maintenue (qui est en fait un plus grand que le plus grand index, pas le nombre d'éléments définis) et quelques méthodes supplémentaires. Vous êtes en sécurité de toute façon; utilisez un tableau si vous avez besoin de fonctionnalités supplémentaires, et un objet dans le cas contraire.
la source
La réponse, comme c'est généralement le cas avec JavaScript, est "c'est un peu plus bizarre ..."
L'utilisation de la mémoire n'est pas définie et toute implémentation est autorisée à être stupide. En théorie,
const a = []; a[1000000]=0;
pourrait brûler des mégaoctets de mémoire, tout commeconst a = [];
. En pratique, même Microsoft évite ces implémentations.Justin Love souligne que l'attribut de longueur est le plus élevé ensemble d'indices élevé. MAIS il n'est mis à jour que si l'index est un entier.
Ainsi, le tableau est clairsemé. MAIS les fonctions intégrées telles que reduction (), Math.max () et "for ... of" parcourront toute la gamme d'indices entiers possibles de 0 à la longueur, visitant beaucoup qui retournent 'indéfini'. MAIS les boucles 'for ... in' peuvent faire ce que vous attendez, en visitant uniquement les clés définies.
Voici un exemple utilisant Node.js:
donnant:
Mais. Il y a plus de cas de coin avec des tableaux non encore mentionnés.
la source
La parcimonie (ou densité) peut être confirmée empiriquement pour NodeJS avec le process.memoryUsage () non standard .
Parfois, le nœud est assez intelligent pour garder le tableau clairsemé:
Parfois, le nœud choisit de le rendre dense (ce comportement pourrait bien être optimisé à l'avenir):
Puis à nouveau clairsemé:
Donc, peut-être que l'utilisation d'un tableau dense pour avoir une idée du bogue original du noyau AIX devra peut-être être forcée avec une plage similaire :
Parce que pourquoi ne pas le faire tomber?
la source
Ils peuvent l'être, mais ils ne doivent pas toujours l'être, et ils peuvent mieux fonctionner lorsqu'ils ne le sont pas.
Voici une discussion sur la façon de tester la parcimonie d'index dans une instance de tableau: https://benmccormick.org/2018/06/19/code-golf-sparse-arrays/
Ce gagnant de code golf (le moins de caractères) est:
En gros, parcourir le tableau pour les entrées indexées tout en décrémentant la valeur de longueur et en renvoyant le
!!
booléen renforcé du résultat numérique faux / véridique (si l'accumulateur est décrémenté jusqu'à zéro, l'index est entièrement rempli et non fragmenté). Les mises en garde de Charles Merriam ci-dessus doivent également être prises en compte et ce code ne les aborde pas, mais elles s'appliquent aux entrées de chaîne hachée, ce qui peut se produire lors de l'affectation d'éléments avecarr[var]= (something)
où var n'était pas un entier.Si vous vous souciez de la rareté des index, ce sont ses effets sur les performances, qui peuvent différer entre les moteurs de script, il y a une grande discussion sur la création / initialisation de tableau ici: Quelle est la différence entre "Array ()" et "[]" lors de la déclaration d'un JavaScript tableau?
Une réponse récente à cet article a un lien vers cette plongée approfondie sur la façon dont V8 tente d'optimiser les tableaux en les étiquetant pour éviter de (re) tester des caractéristiques telles que la parcimonie: https://v8.dev/blog/elements-kinds . Le billet de blog date du 17 septembre et le matériel est sujet à certains changements, mais la ventilation des implications pour le développement quotidien est utile et claire.
la source