Maison  >  Questions et réponses  >  le corps du texte

"Array.prototype.fill() utilise des objets pour transmettre des références au lieu de créer de nouvelles instances"

<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>
P粉682987577P粉682987577424 Il y a quelques jours422

répondre à tous(2)je répondrai

  • P粉878510551

    P粉8785105512023-08-24 00:43:53

    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 :

    a = new Array(ARRAY_SIZE);
        for (var i = 0; i < ARRAY_SIZE; i++) {
            a[i] = [];
        }
        // 或者使用一行代码的替代方案
        for (var i = 0, a = []; i < ARRAY_SIZE; a[i++] = []);

    J'ai testé six alternatives et obtenu les résultats suivants :

    • Array.map(), comme ci-dessus (11 fois plus lentement ! ) :

      a = new Array(ARRAY_SIZE).fill().map(u => { return []; });
    • for loop, meilleure option (la plus rapide) :

      // 标准的多行方式
       a = new Array(ARRAY_SIZE);
       for (var i = 0; i < ARRAY_SIZE; i++) {
           a[i] = [];
       }
      
       // 一行语法
       for (var i = 0, a = []; i < ARRAY_SIZE; a[i++] = []);
    • forEach (6 fois plus lent) :

      a = new Array(ARRAY_SIZE).fill();
       a.forEach((val, i) => {
           a[i] = [];
       })

    [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 :(

      a = Array.from({ length: ARRAY_SIZE }, () => []);
    • [..Array(..)] (5 fois plus lent ! )

      a = [...Array(ARRAY_SIZE)].map(_=>([]))
    • Array.push(..), classé deuxième en termes de performances (2x plus lent ! )

      let a = [], total = ARRAY_SIZE;
       while(total--) a.push([]);

    PS : je l'ai testé sur ce violon.

    répondre
    0
  • P粉461599845

    P粉4615998452023-08-24 00:21:01

    Vous pouvez d'abord utiliser n'importe quelle valeur (par exemple undefined)填充数组,然后您就可以使用map :

    var arr = new Array(2).fill().map(u => ({}));
    
    var arr = new Array(2).fill().map(Object);
    

    répondre
    0
  • Annulerrépondre