balise (séparée par des espaces) : call apply
Lors de l'écriture de code, il est généralement nécessaire d'initialiser rapidement un tableau. Par exemple, nous avons besoin d'un <. similaire celui de matlab>Fonction, si ici nous devons générer un tableau de 0 à 23 pour représenter 24 heures par jour. zeros
L'approche la plus basique est la suivante :
function(){ let hours = []; for(let k = 0; k < 24; k++ ) hours.push(k); return hours; }
Pensez à utiliser la méthode
+ new Array(24)
pour y parvenir. map
Le code est le suivant :
Array(24).map((_, h) => h);
ici est l'index, qui est rarement utilisé ici, l'index est utilisé comme valeur numérique. map
Les résultats ne sont pas à la hauteur des attentes, pourquoi ?
Après une brève recherche, j'ai découvert que cela était dû à la logique des tableaux clairsemés en js.
Jetons d'abord un coup d'œil au code suivant :
let a = []; a[1000] = 2; console.log(a.length);// 1000a.forEach(x => console.log("hello"));// only one "hello"
Supposons qu'une telle logique n'existe pas et que nous écrivions
, ce qui amènera le système à créer un très grand tableau, mais en réalité ne stockera rien. new Array(Date.now())
Nous pouvons simplement comprendre ce que
fait comme le processus suivant : new Array(len)
function(len){ let r = []; r.length = len; return r;
ou new Array(len)
sur map
est incompatible avec les attentes. forEach
Comment résoudre ce problème ? En plus d'utiliser le formulaire de
, nous pouvons également utiliser la méthode d'écriture de new Array(len)
pour initialiser le tableau, mais écrire de cette façon n'atteindra pas notre objectif d'écrire le tableau initialisé. . new Array(1,2,3)
À ce moment-là, nous avons pensé à
. Le deuxième paramètre de cette fonction se trouve être un tableau, nous avons donc écrit le code suivant. apply
// 借用apply Array.apply(null, Array(24)).map((_, h) => h); // [0, 1, ..., 24]
est traité comme 24 valeurs lorsqu'il est utilisé comme paramètre dans Array(24)
, car cela garantit que la longueur finale du tableau est de 24. apply
Dans ce cas, bien sûr, nous pouvons également utiliser la fonction sœur de
apply
. call
// 借用call Array.call(null, ...Array(24)).map((_, h) => h); // [0, 1... 23]
la déstructuration obtiendra Array(len)
paramètres au lieu d'un paramètre. Bien sûr, len
doit être utilisé dans un environnement qui prend en charge l'opérateur de déstructuration. call
et call
, nous pouvons écrire en outre le code suivant : apply
// Array本身 Array(...Array(24)).map((_, h) => h); // [0, 1, ..., 24]
De plus, dans
, ES6
fournit une nouvelle méthode Array
, qui peut être utilisée pour remplir ces bits « vacants » afin de garantir que les opérations ultérieures puissent se dérouler sans problème. fill
Le code spécifique est le suivant :
// 推荐 Array(24).fill(null).map((_, h) => h);
Cependant, vous devez faire attention à l'utilisation de la méthode
, et vous devriez essayer d'éviter le remplissage aveugle, car cela provoquerait les bugs mentionnés ci-dessus que la logique "vide" de js est conçue pour éviter. fill
Si vous êtes intéressé, vous pouvez essayer le code suivant :
// no-fillconsole.time("no-fill");let t = Array(5e7);console.timeEnd("no-fill");// fillconsole.time("fill");let q = Array(5e7).fill(null);console.timeEnd("fill");// => no-fill: 0.240ms// => fill: 3247.921ms
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!