《高性能JavaScript》学习笔记——日更中
------------------2016-7-20更------------------
最近在看《高性能JavaScript》一书,里面当中,有讲很多提高js性能的书,正在看的过程中,记下做法以及原因,供以后学习参考:
1、将经常使用的对象成员、数组项、和域外变量存入局部变量
原因:数据存储位置对大地代码整体性能会产生重要的影响,直接变量和局部变量的访问速度快于数组和对象成员。因为局部变量位于作用域链的第一个对象中,全局变量位于作用域链的最后一环。变量在作用域链的位置越深,访问的时间就越长。
var doc = document; var db = doc.body; var odiv = doc.getElementById('div1');
2、避免使用with表达式,因为他改变了运行期上下文的作用域链。
3、同理with,也要注意使用try-catch,因为catch也会改变运行期上下文的作用域链。
4、嵌套成员变量会造成重大的性能影响,尽量少用。
5、DOM操作量化问题:
//在循坏中更新页面,问题所在:每次循环都对DOM元素访问了两次,一次是读取document.getElementById('here').innerHTML的内容,一次是修改它。
function changeDOM(){
for(var i=0; i < 15000; i++){
document.getElementById('here').innerHTML += 'a';
} }
//改变方法,使用局部变量存好改变量,在循环结束时一并修改
function changeDOM(){
var content ='';
for(var i=0; i < 15000; i++){
content += 'a';
}
document.getElementById('here').innerHTML += content;
}
//关于js字符串拼接的性能优化问题,js的处理机制是:新建一个临时字符串,将新字符串赋值为 content + 'a' ,然后返回这个新字符串并同时销毁原始字符串。导致字符串的连接效率较低的重要原因不仅在于对于新的临时变量的不断创建,还有js的垃圾回收机制下不断在对象创建期间回收,导致的效率低下。提高效率的办法是用数组的join函数:
function changeDOM(){
var content =[];
for(var i=0; i < 15000; i++){
content.push('a');
}
document.getElementById('here').innerHTML += content.join('');
}
//但是同时也要注意,后来的大部分浏览器都对“+”的连接字符串做了优化,由于SpiderMonkey等引擎对字符串的“+”运算做了优化,结果使用Array.join的效率反而不如直接用“+”!,因此建议是:在IE7以下,使用join,在新浏览器下,除了变量缓存外,不需要做别的优化
6、克隆已有的DOM元素,即element.cloneNode(),比起新建节点来说,即element.createElement(),会快一点,但是性能提高不是很大。
7、遍历数组明显快于同样大小和内容的HTML集合
8、 for循环时,HTML某元素集合的长度不建议直接作为循环终止条件,最好将集合的长度赋给一个变量,然后使用变量作为循环终止条件;
原因:当每次迭代过程访问集合的length时,它导致集合器更新,在所有的浏览器上都会产生明显的性能损失。
9、需要考虑实际情况的优化,根据7,可以将集合中的元素通过for循坏赋值到数组中,访问数组的数组快于集合。但是要注意对于复制的开销是否值得。
function toArray(collection){
var arr = [];
var clen = collection.length;
for(var i= 0; i < clen; i++){
arr[i] = collection[i];
} }
10、获取DOM节点,使用nextSibling方式与childNodes方式,在不同的浏览器中,这两种方法的时间基本相等。但是在IE中,nextSibling比childNodes好,IE6下,nextSibling比对手快16倍,在IE7下,快105倍。因此,在老的IE中性能严苛的使用条件下,用nextSibling较好。
11、querySelectorAll()可以联合查询,即querySelectorAll(‘div .warning,div .notice’),在各大浏览器中支持也挺好的,还可以过滤很多非元素节点;
aaarticlea/png;base64,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" alt="" width="638" height="289" />
ps:这个网站是:http://caniuse.com/,可以检查HTML、CSS元素在各大浏览器的兼容情况,一个很有用的网站!
-------------2016-7-21更---------------
12、重绘和重排版;
重绘:不需要改变元素的长度和宽度,不影响DOM的几何属性;
重排版:影响了几何属性,需要重新计算元素的几何属性,而且其他元素的几何属性有可能也会受影响。浏览器会在重排版过程中,重新绘制屏幕上受影响的部分。
获取布局信息的操作将导致刷新队列的动作,如使用:offsetTop、offsetLeft、offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、clientTop、clientLeft、clientHeight、geteComputedStyle()(在IE中此函数成为currentStyle);浏览器此时不得不进行渲染队列中带改变的项目,并重新排版以返回正确值。
解决办法:
a、通过延迟访问布局信息避免重排版。
b、整体修改cssText的css代码,而不是分开访问,修改cssText的属性
//访问了4次DOM,第二次开始重排列并强迫渲染队列执行
var el = document.getElementById('div1');
el.style.borderLeft = '1px';
el.style.borderRight = '2px';
el.style.padding = '5px';
//改进:改变合并,通过cssText实现
var el = document.getElementById('div1');
el.cssText += 'border-left = 1px;border-right = 2px;padding = 5px;';
c、改变css类名来实现样式改变
d、当对DOM元素进行多次修改时,可以通过以下的步骤减少重绘和重排版的次数:
(注意:此过程引发两次重排版,第一次引发一次,第三次引发一次。如果没有此步骤的话,每次对第二步的改变都有可能带来重排版。)
- 从文档流中摘除该元素,摘除该元素的方法有:
- 使其隐藏,进行修改后在显示
- 使用文档片段创建子树,在将他拷贝进文档
var doc = document;
//创建文档子树
var frag = doc.createDocumentFragment();
//自定义函数,将修改内容data赋给文档片段frag,具体过程忽略
appendDataToElement(frag,data);
//注意:添加时实际添加的是文档片段的子节点群,而不是frag自己,只会引发一次重排版
doc.getElementById('div1').appendChild(frag); - 创建一个节点的副本,在副本上进行修改,再让复制节点覆盖原先节点
// 创建一个节点的副本,在副本上进行修改,再让复制节点覆盖原先节点
var oldNode = document.getElementById('old');
var clone = old.cloneNode();
appendDataToElement(clone,data);
oldNode.replaceChild(clone,oldNode);ps:推荐第二种,因为其涉及最少数量的操作和重排列。
- 对其应用多重改变
- 将元素带回文档中
《高性能JavaScript》学习笔记——日更中的更多相关文章
- 高性能javascript学习笔记系列(6) -ajax
参考 高性能javascript javascript高级程序设计 ajax基础 ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读 ...
- 高性能javascript学习笔记系列(4) -算法和流程控制
参考高性能javascript for in 循环 使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...
- 高性能javascript学习笔记系列(3) -DOM编程
参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...
- 高性能javascript学习笔记系列(1) -js的加载和执行
这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...
- 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践
参考高性能javascript 理解浏览器UI线程 用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程 UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...
- 高性能javascript学习笔记系列(2)-数据存取
参考 高性能javascript Tom大叔深入理解javascript系列 相关概念 1.执行上下文 当控制器转到ecmascript可执行代码的时候,就会进入一个执行上下文,执行上下文是以堆栈 ...
- javascript 学习笔记之JQuery中的Deferred对象
Deffered是Jquery中的一个非常重要的对象,从1.5版本之后,Jquery中的ajax操作都基于Deffered进行了重构,这个对象的处理模式就像其他Javascript框中的Promise ...
- 高性能javascript 学习笔记(1)
加载和运行 管理浏览器中的javascript代码是个棘手的问题,因为代码运行阻塞了其他浏览器处理过程,诸如用户绘制,每次遇到<script>标签,页面必须停下来等待代码下载(如果是外部的 ...
- Go学习笔记(持续更中,参考go编程基础,go边看边练)
使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型. 在函数内部,可用更简略的 := 方式定义变量.空白符号_ package main import "fmt ...
随机推荐
- docker inspect获取详细参数的两种方法
docker inspect xx 返回的是一个json格式的数据 以下为部分返回值 [ { "Id": "706813b0da107c4d43c61e3db9da908 ...
- 双端队列 ADT接口 链表实现
Deque ADT接口 DEQUEUE.h: #include <stdlib.h> #include "Item.h" typedef struct DEQUEUEn ...
- 先进先出算法(FIFO)——页面置换
原创 最近操作系统实习,写了先进先出算法(FIFO)的代码来实现页面置换. 题目阐述如下: 设计四:页面置换 设计目的: 加深对请求页式存储管理实现原理的理解,掌握页面置换算法. 设计内容: 设计一个 ...
- scala (1) for 循环
scala if else 判断 (1)在scala中末尾不需要添加 分号 作为语句的终结符. val name = "Leo" (2) 在 scala 中 if else ...
- Linux Shell中管道的原理及C实现框架
在shell中我们经常用到管道,有没考虑过Shell是怎么实现管道的呢? cat minicom.log | grep "error" 标准输入.标准输出与管道 我们知道,每一个进 ...
- 20155210 潘滢昊 2016-2017-2 《Java程序设计》第3周学习总结
20155210 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 class xxx{ }:定义类 运用: class Clothes{ String col ...
- 20155213 实验三《敏捷开发与XP实践》实验报告
20155213 实验三<敏捷开发与XP实践>实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)> ...
- 20155232 2016-2017-2 《Java程序设计》第2周学习总结
20155232 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 类型 基本类型 整数(short.int.long) 字节(byte) -128~127 字 ...
- 20155301 2016-2017-2 《Java程序设计》第3周学习总结
20155301 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 1.在clothes类中定义了两个变量,很像C语言中自定义变量,clothes属于非公开类. ...
- 20155302 2016-2017-2 《Java程序设计》第4周总结
20155302 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 有关类的继承的理解:类实现继承的格式:class 子类名 extends 父类名 类的继承有 ...