Maison >interface Web >js tutoriel >Résumé des points de connaissances JavaScript : comment améliorer les compétences performance_javascript
Les problèmes de performances de JavaScript ne peuvent pas être sous-estimés, ce qui oblige les développeurs à prêter plus d'attention à certains détails lors de l'écriture de programmes JavaScript. Cet article présente de manière très détaillée les points de connaissance de l'optimisation des performances de JavaScript, ce qui est certainement une information utile.
Permettez-moi d'abord de consolider la syntaxe de base du javascript :
Syntaxe de base du javascript
Utilisez le mot-clé var pour définir des variables
Syntaxe : var nom de la variable = valeur de la variable
identifiant : ①, composé de lettres, de chiffres et de traits de soulignement. Il ne peut pas commencer par un chiffre. Il ne peut pas s'agir d'un mot-clé. Il est strictement sensible à la casse.
Type de données :Type numérique : numéro
Chaîne : chaîne
Type booléen : booléen
Types de données spéciaux : non défini vide non défini non attribué
Valeur nulle : null
Fonction objet de type référence
Détecter le type de données du paramètre : typeof() renvoie la chaîne correspondant au type de données
Utilisation de deux signes égaux == et de trois signes égaux ===
== : Les valeurs de comparaison sont égales quel que soit le type de données
=== : La comparaison congruente est liée à la fois aux valeurs numériques et aux types de données
Environnement booléen : convertit automatiquement en valeur booléenne lors de la rencontre avec if
Environnement booléen dans string string : vide est faux, non vide est vrai
Environnement booléen en nombre numérique : 0 est faux, non-0 est vrai
La relation entre le nombre et la chaîne
① En cas de rencontre, effectuez une opération d'épissage
.
② Lorsque des opérations doivent être effectuées, la chaîne doit être convertie en valeur numérique.
Méthode de conversion 1, chaîne*1 en type numériqueMéthode de conversion 2 : convertir un nombre (chaîne) en type numérique
1 : Emplacement de chargement des fichiers js
2 : Fusion de fichiers js
Dans de nombreux développements en équipe, nous pouvons placer des blocs de code avec différentes fonctions dans différents fichiers js, afin qu'il soit plus pratique pour tout le monde de collaborer à l'écriture de code pendant le processus de développement. Après tout, il nous suffit de trouver le dossier correspondant. ou un fichier. Ne recherche pas de méthode dans un fichier long. Cela améliorera en effet l'efficacité du développement de l'équipe et permettra aux nouvelles personnes d'effectuer plus facilement le développement secondaire et la maintenance après leur arrivée. Alors que diriez-vous d’intégrer ce problème dans les performances des pages ? C'est exactement le problème exposé dans le livre : chaque requête HTTP entraîne une surcharge de performances supplémentaire, donc le téléchargement d'un seul fichier de 100 Ko sera plus rapide que le téléchargement de quatre fichiers de 25 Ko.
Je voudrais mentionner brièvement ici que vous pouvez également utiliser les attributs defer et async lors du chargement de fichiers pour un chargement différé et un chargement asynchrone. Dans les navigateurs modernes, la plupart d'entre eux prennent déjà en charge l'attribut defer. Je n'ai pas l'habitude de l'utiliser. pour l’instant, je ne sais pas s’il y aura des problèmes spécifiques. Les amis intéressés peuvent rechercher eux-mêmes ce point de connaissance sur Google, et je le mentionnerai brièvement ici.
Trois : un accès plus rapide aux données
Pour le navigateur, plus la localisation d'un identifiant est profonde, plus sa lecture et son écriture seront lentes (il en est de même pour la chaîne de prototypes). Cela ne devrait pas être difficile à comprendre. Une analogie simple est la suivante : plus l'épicerie est loin de chez vous, plus il vous faut du temps pour faire de la sauce soja... Vilain, si vous mettez autant de temps à faire de la sauce soja, les légumes sera brûlé -.-~
Si nous devons utiliser une valeur de variable plusieurs fois dans la fonction actuelle, nous pouvons d'abord utiliser une variable locale pour la stocker. Le cas est le suivant :
//修改前 function showLi(){ var i = 0; for(;i<document.getElementsByTagName("li").length;i++){ //一次访问document console.log(i,document.getElementsByTagName("li")[i]); //三次访问document }; }; //修改后 function showLi(){ var li_s = document.getElementsByTagName("li"); //一次访问document var i = 0; for(;i<li_s.length;i++){ console.log(i,li_s[i]); //三次访问局部变量li_s }; };
Quatre : Optimisation des opérations DOM
Comme nous le savons tous, les opérations DOM consomment beaucoup plus de performances que l'exécution de JavaScript. Bien que nous ne puissions pas éviter d'opérer sur DOM, nous pouvons essayer de réduire autant que possible la consommation de performances de cette opération.
Expliquons cela à travers le code :
function innerLi_s(){ var i = 0; for(;i<20;i++){ document.getElementById("Num").innerHTML="A"; //进行了20次循环,每次又有2次DOM元素访问:一次读取innerHTML的值,一次写入值 }; };
Réécrivez la méthode ci-dessus :
function innerLi_s(){ var content =""; var i = 0; for(;i<20;i++){ content += "A"; //这里只对js的变量循环了20次 }; document.getElementById("Num").innerHTML += content; //这里值进行了一次DOM操作,又分2次DOM访问:一次读取innerHTML的值,一次写入值 };
5 : Réduire le redessin et le réarrangement de Dom
Les modifications dans la disposition des éléments, les ajouts, les suppressions de contenu ou les modifications de la taille de la fenêtre du navigateur entraîneront une redistribution, tandis que les modifications de la couleur de la police ou de la couleur d'arrière-plan entraîneront un redessin.
Pour des opérations similaires au code suivant, on dit que la plupart des navigateurs modernes ont été optimisés (optimisés en 1 version de réarrangement) :
//修改前 var el = document.getElementById("div"); el.style.borderLeft = "1px"; //1次重排版 el.style.borderRight = "2px"; //又1次重排版 el.style.padding = "5px"; //还有1次重排版 //修改后 var el = document.getElementById("div"); el.style.cssText = "border-left:1px;border-right:2px;padding:5px"; //1次重排版
Pour plusieurs opérations, les trois méthodes suivantes peuvent également réduire le nombre de refusions et de redessins :
1.Dom est d'abord masqué, puis affiché après opération 2 réarrangements (affichage temporaire : aucun)
2.document.createDocumentFragment() crée un traitement de fragment de document, l'ajoute à la page après l'opération et le réorganise une fois
3.var newDOM = oldDOM.cloneNode(true) crée une copie de Dom Après avoir modifié la copie, oldDOM.parentNode.replaceChild(newDOM,oldDOM) écrase le DOM d'origine et le réorganise 2 fois
5 : Optimisation de la boucle
Cela devrait être une méthode d'écriture que beaucoup de gens connaissent. Vous pouvez simplement la parcourir (elle sera encore expliquée sous forme de commentaires de code plus tard)~
//修改前 var i = 0; for(;i<arr.lengthli++){ //每次循环都需要获取数组arr的length console.log(arr[i]); } //修改后 var i = 0; var len = arr.length; //获取一次数组arr的length for(;i<len;i++){ console.log(arr[i]); } //or var i = arr.length;; for(;i;i--){ console.log(arr[i]); }
6 : Bon usage du binaire
Par exemple : en prenant modulo 2, le bit le plus bas des nombres pairs est 0, le bit le plus bas des nombres impairs est 0, le résultat de l'opération ET au niveau du bit avec 1 est 0, le bit le plus bas du nombre impair est 1, le résultat de l'opération ET au niveau du bit avec 1 est 1.
Le code est le suivant :
.odd{color:red} .even{color:yellow} <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> </ul> var i = 0; var lis = document.getElementsByTagName("li"); var len = lis.length; for(;i<len;i++){ if(i&1){ lis[i].className = "even"; } else{ lis[i].className = "odd"; } };
Bien que les navigateurs modernes aient fait du bon travail, je pense que c'est ma quête de la qualité du code. Et peut-être que ne pas prêter attention à un ou deux points n'aura pas beaucoup d'impact sur les performances, mais après avoir optimisé à partir de plusieurs points, les résultats possibles seront un saut qualitatif~