一、加载和运行

Javascript代码执行会阻塞其他浏览器处理过程、充分利用webpack或gulp工具对文件打包压缩,减少js文件的数量,从而减少http请求的次数,以提高网页应用的实际性能。

二、数据访问

经典计算机科学的一个问题是确定数据应当存放在什么地方、以实现最佳的读写效率。数据存储在哪里会关系到代码运行期间数据被检索到的速度。

JS中的四种基本的数据存储位置:直接量(字符串、数字、布尔值、对象、数组、函数、正则、null、undefind)、变量、数组项、对象成员。

每一种数据存储位置都具有特定的读写操作负担。直接量和局部变量的访问速度要快于数组项和对象成员的访问速度。因此尽量使用直接量和局部变量,限制数组项和对象成员的使用。

对所有的浏览器来说,一个标识符所处的位置越深,读写它的速度就越慢。在函数体内中,如果对于使用多于一次的变量值,就尽量用局部变量存储本地范围之外的变量值。

局部变量比域外变量快,是因为他位于作用域链的第一个对象中。变量在作用域链的位置越深,访问的实际就越长。全局变量总是最慢的,因为它们总是位于作用域链的最后一环。

嵌套对象成员会造成重大性能影响,应尽量少用。

三、DOM编程

文档对象模型(DOM)是一个独立于语言的,使用XML和HTML文档操作的应用程序接口。DOM和JS(ECMAScript)相互独立并以功能接口连接,因此每次通过js访问或修改DOM就会带来性能损耗。

一般而言,对于任何类型的DOM访问,假如同一个DOM属性或方法被访问一次以上,最好使用一个局部变量缓存此DOM成员。

重绘和重排:当DOM改变影响到元素的几何属性(宽高)或其内部内容时,浏览器需要重新计算元素的几何属性,而且其他元素的几何属性和位置也会因此改变受到影响。浏览器使渲染树上受到的部分失效,然后重构渲染树。这个过程被称作重排。重排版完成时,浏览器会在一个重绘进程中重新绘制屏幕上受影响的部分。

引发重排的几个原因:

         1、添加或删除可见的DOM元素

         2、元素位置改变

         3、元素尺寸改变(盒子模型)

         4、内容改变

         5、最初的页面渲染

         6、浏览器窗口尺寸的改变

针对重排和重绘引发的性能问题可以通过批量修改、离线操作DOM树、缓存并减少对布局信息的访问来降低其带来的影响。

事件托管技术可以最小化事件句柄数量。

四、算法和流程控制

JS中的for-in循环可枚举任何对象的命名属性(包括对象的实例属性和继承而来的属性),一般不推荐使用。

JavaScript引擎所支持的递归数量与JavaScript调用栈的大小直接相关。

五、响应接口

大多数浏览器有一个单独的处理进程,它由两个任务所共享:JavaScript任何和用户界面更新任务(UI线程)。

一个单一的JavaScript操作应当使用的总时间(最大)是100毫秒。

当多个重复的定时器被同事创建会产生性能问题。因为只有一个UI线程,所有定时器竞争运行时间。

六、Ajax  异步JavaScript和XML

ajax是一种与服务器通讯而不重载当前页面的方法。

Beacons(灯标):JS用于创建一个新的Image对象,将src设置为服务器上一个脚本文件的url,该url包含希望通过get格式传回的键值对数据。

作为数据格式,纯文本和HTML是高度限制的,但其可以节省客户端的CPU周期。XML应用广泛但非常冗长且解析缓慢。json是轻量级、解析迅速,交互性和XML相当。自定义格式非常轻量。总而言之,越轻量级的格式越好,最好是json和字符分割的自定义格式。

七、编程实践

eval()、Function()构造器、定时器(setTimeout()和setInterval())四种函数可以允许在程序中获取一个包含代码的字符串然后运行它。但此时会付出二次评估的代价,与直接包含相应代码相比将占用更长的时间。

定时器建议第一个参数传入一个函数而不是一个字符串,否则会造成内存泄漏。

JS的原生部分一般是用低级语言写的,如C++,所以无论怎样优化JS代码,永远不会比JS引擎提供的原生方法更快,比如内置的Math对象提供的诸多方法。

高性能Javascript总结的更多相关文章

  1. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  2. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  3. 《高性能javascript》 领悟随笔之-------DOM编程篇

    <高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  4. 各种JS模板引擎对比数据(高性能JavaScript模板引擎)

    最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...

  5. 高性能javascript学习笔记系列(6) -ajax

    参考 高性能javascript javascript高级程序设计 ajax基础  ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读 ...

  6. 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践

    参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...

  7. 高性能JavaScript 编程实践

    前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...

  8. 高性能javascript学习笔记系列(4) -算法和流程控制

    参考高性能javascript for in 循环  使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...

  9. 高性能javascript学习笔记系列(3) -DOM编程

    参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...

  10. 高性能javascript学习笔记系列(2)-数据存取

    参考 高性能javascript Tom大叔深入理解javascript系列 相关概念 1.执行上下文   当控制器转到ecmascript可执行代码的时候,就会进入一个执行上下文,执行上下文是以堆栈 ...

随机推荐

  1. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归

    标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...

  2. JAVA 反射机制 获得 private 变量

    public class Triangle { // 定义三角形的三边 protected long lborderA = 0; protected long lborderB = 0; protec ...

  3. 最新sublimetext3080注册

    ----- BEGIN LICENSE -----K-20Single User LicenseEA7E-9401293A099EC1 C0B5C7C5 33EBF0CF BE82FE3BEAC216 ...

  4. 【Hadoop】HDFS笔记(三):HDFS的Shell操作

    HDFS处理文件的命令和Linux命令差不多,但注意区分大小写. (Linux区分大小写,Windows不区分大小写) 一.fs命令 键入命令"./bin/hadoop fs"将输 ...

  5. Oracle中的集合运算

    前言:在实际项目中对多表进行集合运算使用非常广泛,以下是对集合操作的部分总结. 一,建表,插入测试数据 create table a( numbers integer ) create table b ...

  6. u3d shader学习笔记1

    促使我学习SHADER的重要原因是希望深入理解3D渲染的机制,在此基础上可以灵活达到某种效果与性能的平衡,开发出具有良好体验的VR应用. 因为VR应用体验的好坏,直接由游戏的帧率决定,而游戏的帧率则受 ...

  7. POJ - 3414 Pots BFS(著名倒水问题升级版)

    Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...

  8. 洛谷 - P1338 - 末日的传说 - 打表

    https://www.luogu.org/problemnew/show/P1338 先打表看了一下规律,居然看出来n的位置是阶梯往前的.而每个阶梯的头头,必有后半段降序. 再仔细看一下居然每次交换 ...

  9. 201621123016 《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  10. PHP之操作数组

    https://www.jb51.net/Special/623.htm https://www.php.net/manual/zh/ref.array.php https://www.runoob. ...