iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >JS编写优化的技巧有哪些
  • 200
分享到

JS编写优化的技巧有哪些

2024-04-02 19:04:59 200人浏览 独家记忆
摘要

本篇内容主要讲解“js编写优化的技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS编写优化的技巧有哪些”吧!1. 按强类型风格写代码JS 是弱类型的,

本篇内容主要讲解“js编写优化的技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS编写优化的技巧有哪些”吧!

1. 按强类型风格写代码

JS 是弱类型的,但是写代码的时候不能太随意,写得太随意也体现了编码风格不好。下面分点说明:

(1)定义变量的时候要指明类型,告诉 JS 解释器这个变量是什么数据类型的,而不要让解释器去猜,例如不好的写法:

var num,     str,     obj;

声明了三个变量,但其实没什么用,因为解释器不知道它们是什么类型的,好的写法应该是这样的:

var num = 0,     str = '',     obj = null;

定义变量的时候就给他一个默认值,这样不仅方便了解释器,也方便了阅读代码的人,他会在心里有数——知道这些变量可能会当作什么用。

(2)不要随意地改变变量的类型,例如下面代码:

var num = 5; num = "-" + num;

第 1 行它是一个整型,第 2 行它变成了一个字符串。因为 JS  最终都会被解释成汇编的语言,汇编语言变量的类型肯定是要确定的,你把一个整型的改成了字符串,那解释器就得做一些额外的处理。并且这种编码风格是不提倡的,有一个变量第  1 行是一个整型,第 10 行变成了一个字符串,第 20 行又变成了一个  object,这样就让阅读代码的人比较困惑,上面明明是一个整数,怎么突然又变成一个字符串了。好的写法应该是再定义一个字符串的变量:

var num = 5; var sign = "-" + num;

(3)函数的返回类型应该是要确定的,例如下面不确定的写法:

function getPrice(count){     if(count < 0) return "";     else return count * 100; }

getPrice 这个函数有可能返回一个整数,也有可能返回一个空的字符串。这样写也不太好,虽然它是符合 JS  语法的,但这种编码风格是不好的。使用你这个函数的人会有点无所适从,不敢直接进行加减乘除,因为如果返回字符串进行运算的话值就是 NaN  了。函数的返回类型应该是要确定的,如下面是返回整型:

function getPrice(count){     if(count < 0) return -1;     else return count * 100; }

然后告诉使用者,如果返回-1 就表示不合法。如果类型确定,解释器也不用去做一些额外的工作,可以加快运行速度。

2. 减少作用域查找

(1)不要让代码暴露在全局作用域下

例如以下运行在全局作用域的代码:

<script>     var map = document.querySelector("#my-map");     map.style.height = "600px"; </script>

有时候你需要在页面直接写一个 script,要注意在一个 script  标签里面,代码的上下文都是全局作用域的,由于全局作用域比较复杂,查找比较慢。例如上面的 map 变量,第二行在使用的时候,需要在全局作用域查找一下这个变量,假设  map 是在一个循环里面使用,那可能就会有效率问题了。所以应该要把它搞成一个局部的作用域:

<script> !function(){     var map = document.querySelector("#my-map");     map.style.height = "600px"; }() </script>

上面用了一个 function 制造一个局部作用域,也可以用 es6 的块级作用域。由于 map  这个变量直接在当前的局部作用域命中了,所以就不用再往上一级的作用域(这里是全局作用域)查找了,而局部作用域的查找是很快的。同时直接在全局作用域定义变量,会污染  window 对象。

(2)不要滥用闭包

闭包的作用在于可以让子级作用域使用它父级作用域的变量,同时这些变量在不同的闭包是不可见的。这样就导致了在查找某个变量的时候,如果当前作用域找不到,就得往它的父级作用域查找,一级一级地往上直到找到了,或者到了全局作用域还没找到。因此如果闭包嵌套得越深,那么变量查找的时间就越长。如下:

function getResult(count){     count++;     function process(){         var factor = 2;         return count * factor - 5;     }     return process(); }

上面的代码定义了一个 process 函数,在这个函数里面 count 变量的查找时间要高于局部的 factor 变量。其实这里不太适合用闭包,可以直接把  count 传给 process:

function getResult(count){     count++;     function process(count){         var factor = 2;         return count * factor - 5;     }     return process(count); }

这样 count 的查找时间就和 factor  一样,都是在当前作用域直接命中。这个就启示我们如果某个全局变量需要频繁地被使用的时候,可以用一个局部变量缓存一下,如下:

var url = ""; if(window.location.protocal === "https:"){     url = "wss://xxx.com" + window.location.pathname + window.location.search; }

频繁地使用了 window.location 对象,所以可以先把它缓存一下:

var url = ""; var location = window.location; if(location.protocal === "Https:"){     url = "wss://xxx.com" + location.pathname + location.search; }

搞成了一个局变变量,这样查找就会明显快于全局的查找,代码也可以写少一点。

3.避免==的使用

这里你可能会有疑问了,有些人喜欢用==,有些人喜欢用===,大家的风格不一样,你为什么要强制别人用===呢?习惯用==的人,不能仅仅是因为==比===少敲了一次键盘。为什么不提倡用==呢?

(1)如果你确定了变量的类型,那么就没必要使用==了,如下:

if(typeof num != "undefined"){  } var num = parseInt(value); if(num == 10){  }

上面的两个例子都是确定类型的,一个是字符串,一个是整数。就没必要使用==了,直接用===就可以了。

(2)如果类型不确定,那么应该手动做一下类型转换,而不是让别人或者以后的你去猜这里面有类型转换,如下:

var totalPage = "5"; if(parseInt(totalPage) === 1){  }

(3)使用==在 JSLint 检查的时候是不通过的:

if(a == b){  }

如下 JSLint 的输出:

Expected &lsquo;===&rsquo; and instead saw &lsquo;==&rsquo;. if(a == b){

(4)并且使用==可能会出现一些奇怪的现象,这些奇怪的现象可能会给代码埋入隐患:

null == undefined          //true '' == '0'                  //false 0  == ''                   //true 0  == '0'                  //true '  ' == 0            //true new String("abc") == "abc" //true new Boolean(true) == true  //true true == 1                  //true

上面的比较在用===的时候都是 false,这样才是比较合理的。例如第一点 null 居然会等于 undefined,就特别地奇怪,因为 null 和  undefined 是两个毫无关系的值,null 应该是作为初始化空值使用,而 undefined 是用于检验某个变量是否未定义。这和第 1  点介绍强类型的思想是相通的。

4. 合并表达式

如果用 1 句代码就可以实现 5 句代码的功能,那往往 1 句代码的执行效率会比较高,并且可读性可能会更好

(1)用三目运算符取代简单的 if-else

如上面的 getPrice 函数:

function getPrice(count){     if(count < 0) return -1;     else return count * 100; }

可以改成:

function getPrice(count){     return count < 0 ? return -1 : count * 100; }

这个比写一个 if-else 看起来清爽多了。当然,如果你写了 if-else,压缩工具也会帮你把它改三目运算符的形式:

function getPrice(e){return 0>e?-1:100*e}

(2)连等

连等是利用赋值运算表达式会返回所赋的值,并且执行顺序是从右到左的,如下:

overtime = favhouse = listingDetail = {...}

有时候你会看到有人这样写:

var age = 0; if((age = +fORM.age.value) >= 18){     console.log("你是成年人"); } else {     consoe.log("小朋友,你还有" + (18 - age) + "就成年了"); }

也是利用了赋值表达式会返回一个值,在 if 里面赋值的同时用它的返回值做判断,然后 else 里面就已经有值了。上面的+号把字符串转成了整数。

(3)自增

利用自增也可以简化代码。如下,每发出一条消息,localMsgId 就自增 1:

chatService.sendMessage(localMsgId++, msGContent);

5. 减少魔数

例如,在某个文件的第 800 行,冒出来了一句:

dialogHandler.showQuestionNaire("seller", "sell", 5, true);

就会让人很困惑了,上面的四个常量分别代表什么呢,如果我不去查一个那个函数的变量说明就不能够很快地意会到这些常量分别有什么用。这些意义不明的常量就叫“魔数”。所以最好还是给这些常量取一个名字,特别是在一些比较关键的地方。例如上面的代码可改成:

var naireType = "seller",     dialogType = "sell",     questionsCount = 5,     reloadWindow = true;  naireHandler.showNaire(naireType, dialogType, questionsCount, reloadWindow);

这样意义就很明显了。

6. 使用 ES6 简化代码

ES6 已经发展很多年了,兼容性也已经很好了。恰当地使用,可以让代码更加地简洁优雅。

(1)使用箭头函数取代小函数

有很多使用小函数的场景,如果写个 function,代码起码得写 3 行,但是用箭头函数一行就搞定了,例如实现数组从大到小排序

var nums = [4, 8, 1, 9, 0]; nums.sort(function(a, b){     return b - a; }); //输出[9, 8, 4, 1, 0]

如果用箭头函数,排序只要一行就搞定了:

var nums = [4, 8, 1, 9, 0];``nums.sort(a, b => b - a);

代码看起来简洁多了,还有 setTimeout 里面经常会遇到只要执行一行代码就好了,写个 function  总感觉有点麻烦,用字符串的方式又不太好,所以这种情况用箭头函数也很方便:

setTimeout(() => console.log("hi"), 3000)

箭头函数在 c++/Java 等其它语言里面叫做 Lambda 表达式,Ruby 比较早就有这种语法形式了,后来 C++/Java  也实现了这种语法。当然箭头函数或者 Lambda 表达式不仅适用于这种一行的,多行代码也可以,不过在一行的时候它的优点才比较明显。

(2)使用 ES6 的 class

虽然 ES6 的 class 和使用 function 的 prototype 本质上是一样的,都是用的原型。但是用 class  可以减少代码量,同时让代码看起来更加地高大上,使用 function 要写这么多:

function Person(name, age){     this.name = name;     this.age = age; }  Person.prototype.addAge = function(){     this.age++; };  Person.prototype.setName = function(name){     this.name = name; };

使用 class 代码看加地简洁易懂:

class Person{     constructor(name, age){         this.name = name;         this.age = age;     }     addAge(){         this.age++;     }     setName(name){         this.name = name;     } }

并且 class 还可以很方便地实现继承、静态的成员函数,就不需要自己再去通过一些技巧去实现了。

(3)字符串拼接

以前要用+号拼接:

var tpl =     '<div>' +     '    <span>1</span>' +     '</div>';

现在只要用两个反引号“`”就可以了:

var tpl = `   <div>         <span>1</span>     </div> `;

另外反引号还支持占位替换,原本你需要:

var page = 5,     type = encodeURIComponet("#js"); var url = "/list?page=" + page + "&type=" + type;

现在只需要:

var url = `/list?page=${page}&type=${type}`;

就不用使用+号把字符串拆散了。

(4)块级作用域变量

块级作用域变量也是 ES6 的一个特色,下面的代码是一个任务队列的模型抽象:

var tasks = []; for(var i = 0; i < 4; i++){     tasks.push(function(){         console.log("i is " + i);     }); } for(var j = 0; j < tasks.length; j++){     tasks[j](); }

但是上面代码的执行输出是 4,4,4,4,并且不是想要输出:0,1,2,3,所以每个 task 就不能取到它的 index 了,这是因为闭包都是用的同一个  i 变量,i 已经变成 4 了,所以执行闭包的时候就都是 4 了。那怎么办呢?可以这样解决:

var tasks = []; for(var i = 0; i < 4; i++){     !function(k){         tasks.push(function(){             console.log("i is " + k);         });     }(i); } for(var j = 0; j < tasks.length; j++){     tasks[j](); }

把 i 赋值给了 k,由于 k 它是一个 function 的一个参数,每次执行函数的时候,肯定会实例化新的 k,所以每次的 k  都是不同的变量,这样就输出就正常了。但是代码看起来有点别扭,如果用 ES6,只要把 var 改成 let 就可以了:

var tasks = []; for(let i = 0; i <= 4; i++){     tasks.push(function(){         console.log("i is " + i);     }); } for(var j = 0; j < tasks.length; j++){     tasks[j](); }

只改动了 3 个字符就达到了目的。因为 for 循环里面有个大括号,大括号就是一个独立的作用域,let  定义的变量在独立的作用域里面它的值也是独立的。当然即使没写大括号 for 循环执行也是独立的。除了以上几点,ES6 还有其它一些比较好用的功能,如 Object的 assign,Promise 等,也是可以帮助写出简洁高效的代码。

到此,相信大家对“JS编写优化的技巧有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JS编写优化的技巧有哪些

本文链接: https://www.lsjlt.com/news/85028.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS编写优化的技巧有哪些
    本篇内容主要讲解“JS编写优化的技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS编写优化的技巧有哪些”吧!1. 按强类型风格写代码JS 是弱类型的,...
    99+
    2024-04-02
  • 优化MySQL的技巧有哪些
    这篇文章主要介绍优化MySQL的技巧有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SQL执行慢的原因网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等硬件问题没有索引或者索引...
    99+
    2024-04-02
  • css的优化技巧有哪些
    这篇文章主要介绍“css的优化技巧有哪些”,在日常操作中,相信很多人在css的优化技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css的优化技巧有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-08
  • JavaScript优化技巧有哪些
    这篇文章主要介绍“JavaScript优化技巧有哪些”,在日常操作中,相信很多人在JavaScript优化技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaSc...
    99+
    2024-04-02
  • MySQL优化技巧有哪些
    本篇内容主要讲解“MySQL优化技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL优化技巧有哪些”吧!SQL 优化已经成为衡量程序猿优秀与否的硬...
    99+
    2024-04-02
  • SQL优化技巧有哪些
    这篇文章主要讲解了“SQL优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL优化技巧有哪些”吧!一、索引优化索引的数据结构是 B+Tree,...
    99+
    2024-04-02
  • 编写Python小技巧有哪些
    本篇内容主要讲解“编写Python小技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“编写Python小技巧有哪些”吧!1. List:all_equal功能实现:检验一个列表中的所有元素...
    99+
    2023-06-16
  • 有哪些编写短小精炼的JS代码小技巧
    本篇内容主要讲解“有哪些编写短小精炼的JS代码小技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些编写短小精炼的JS代码小技巧”吧!短路Javascrip...
    99+
    2024-04-02
  • mysql join优化的技巧有哪些
    优化MySQL JOIN操作可以提高查询性能,以下是一些常见的优化技巧:1. 使用合适的索引:确保参与JOIN的列都有合适的索引,这...
    99+
    2023-10-23
    mysql join
  • mysql sql优化的技巧有哪些
    以下是一些MySQL SQL优化的常见技巧: 使用索引:为频繁使用的列创建索引,以提高查询性能。可以使用EXPLAIN语句来分析查...
    99+
    2024-04-09
    mysql
  • MyBatis的SQL优化技巧有哪些
    使用索引:在数据库表中创建索引可以大大提高查询性能。在编写SQL语句时,尽量使用索引列作为查询条件。 避免使用通配符查询:尽...
    99+
    2024-05-08
    MyBatis SQL
  • 有哪些JS技巧
    这篇文章主要讲解了“有哪些JS技巧”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些JS技巧”吧! 1.三元运算符新手let hung...
    99+
    2024-04-02
  • oracle sql优化的技巧有哪些
    以下是一些Oracle SQL优化的技巧: 使用索引:确保在常用的查询列上创建索引,以加快查询速度。可以使用EXPLAIN PLA...
    99+
    2024-04-09
    oracle
  • html代码编写的技巧有哪些
    本文小编为大家详细介绍“html代码编写的技巧有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“html代码编写的技巧有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1....
    99+
    2024-04-02
  • JS技巧有哪些
    这篇文章将为大家详细讲解有关JS技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 确保数组值使用 grid ,需要重新创建原始数据,并且每行的列长度可能不匹配...
    99+
    2024-04-02
  • JavaScript优化技巧都有哪些
    JavaScript优化技巧都有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。作为开发人员,我们一直在寻找让我们的代码更快更好的方法。但在...
    99+
    2024-04-02
  • SQL优化技巧有哪些呢
    这期内容当中小编将会给大家带来有关SQL优化技巧有哪些呢,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 数据库SQL优化大总结之 百万级数据库...
    99+
    2024-04-02
  • DIV CSS优化技巧有哪些
    这篇文章主要讲解了“DIV CSS优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DIV CSS优化技巧有哪些”吧!一、CSS样式属性单词代码简...
    99+
    2024-04-02
  • HTML代码编写技巧有哪些
    这篇文章主要为大家展示了“HTML代码编写技巧有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML代码编写技巧有哪些”这篇文章吧。1. 一定要闭合HTML标签在以往的页面源代码里,经常看...
    99+
    2023-06-08
  • Java程序性能优化的编程技巧有哪些
    本篇内容主要讲解“Java程序性能优化的编程技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序性能优化的编程技巧有哪些”吧!1、慎用异常在Java软件开发中,经常使用 try-...
    99+
    2023-06-17
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作