"Array.prototype.fill() utilise des objets pour transmettre des références au lieu de créer de nouvelles instances"
P粉682987577
2023-08-23 09:15:17
<p>Je jouais un peu, essayant d'instancier un nouveau tableau de longueur <code>x</code>, où tous les éléments du tableau étaient initialisés à la valeur <code>y</code> : ≪ /p>
<pre class="brush:php;toolbar:false;">var arr = new Array(x).fill(y);</pre>
<p>Cette méthode fonctionne bien si la valeur de <code>y</code> n'est pas un <strong>object</strong>.
Autrement dit, si <code>y</code> est un objet, alors les conditions suivantes sont vraies : </p>
<pre class="brush:php;toolbar:false;">var arr = new Array(2).fill({});
arr[0] === arr[1]; //Le résultat est vrai ;
arr[0].test = 'chaîne';
arr[1].test === 'string'; //Le résultat est également vrai;</pre>
<p>Existe-t-il un moyen de déclarer qu'un nouvel objet doit être créé pour chaque élément lors de l'utilisation de la fonction de remplissage ? Ou dois-je le convertir en boucle ? </p>
La réponse acceptée est excellente et fonctionne 90 % du temps.
Cependant, si vous créez une application JS hautes performances et que vous utilisez des tableaux grands/énormes, Array.map(..) créera beaucoup de charge en termes d'utilisation de la mémoire et du processeur car il créera le tableau copie.
Je recommande d'utiliser la boucle classique for :
J'ai testé six alternatives et obtenu les résultats suivants :
Array.map(), comme ci-dessus (11 fois plus lentement ! ) :
for loop, meilleure option (la plus rapide) :
forEach (6 fois plus lent) :
[Mise à jour le 27/08/2020] Ilias Karim a proposé une autre méthode
Array.from (30 fois plus lent ! ) - évidemment pire en termes de performances, malgré la meilleure syntaxe :(
[..Array(..)] (5 fois plus lent ! )
Array.push(..), classé deuxième en termes de performances (2x plus lent ! )
PS : je l'ai testé sur ce violon.
Vous pouvez d'abord utiliser n'importe quelle valeur (par exemple
undefined
)填充数组,然后您就可以使用map
: