美文网首页
读书笔记2,高性能JavaScript编程

读书笔记2,高性能JavaScript编程

作者: coder_coder | 来源:发表于2019-02-14 15:01 被阅读0次

    不记得什么时候看得这本书了,今天拿来一看,嗯~内容真的是很简单了,,作为纪念还是来总结下吧。
    此书,主要是从各个方面讲解了如何最大化的进行前端性能优化。

    加载和运行

    多个js文件可并行下载,但是仍会阻塞其他文件如图片的下载。

    js下载和运行会阻塞浏览器运行,所以在script标签里的js代码一定要注意。

    优化:放在body底部,延时加载(defer,dom加载完成后)

    每个http请求都会产生额外性能负担,1个100K的文件比4个25Kb的文件下载要快。所以应适当使用打包

    数据访问

    每一种数据存储位置都具有特定的读写操作负担。大多数情况下,对一个直接量和一个局部变量数据访问,其性能消耗是微不足道的。访问数组和对象成员的代价要高一些。

    对不同数据类型进行200,000次读操作所用的时间

    1. 作用域:一个变量的可访问区域

    作用域链:一个函数在创建时,相应的会产生一个作用域链。这个链有下(当前函数作用域,运行时上下文)层层到上(全局作用域),记录了该函数所有可访问的变量。

    在函数运行过程,每遇到一个变量,标识符识别过程要决定从哪里获得或存储数据。此过程先从运行时上下文,层层向上查找(未找到,则将变量定为未定义)。正是这搜索过程影响了性能。

    一个标识符的位置越深,他的读写速度越慢,所以函数内局部变量的访问速度是最快的,全局通常是最慢的(部分浏览器会优化此处)。建议:全局变量先存储在局部变量里,如document对象就可以先定义一个局部doc对象存储。
    作用域链改变: try发生异常后,会把自己的作用域链转给catch

    2. 闭包:允许函数访问局部范围之外的数据。

    在经常访问一些范围之外的变量,每次访问都会导致一些性能损失。

    一个函数的激活对象与运行期上下文一同销毁,当涉及闭包时,激活对象无法销毁了,因为引用仍然存在于闭包中。这意味着,闭包比非闭包函数需要更多内存消耗

    3.对象: 实例属性,原型属性

    js是面向对象的

    深入原型链越深,搜索属性的速度越慢

    DOM编程

    对DOM(文档对象模型)的操作代价昂贵,在富页面应用中通常是一个性能瓶颈。
    访问修改DOM元素

    优化:减少访问,先克隆在修改

    修改DOM元素,造成重绘或重新排版:
    优化:

    1. 从文档流中摘除该元素(隐藏,克隆),

    2. 使元素脱离文档流(position:absolute)

    浏览器在下载完所有资源后,他解析完文件会创建2个内部数据结构:dom树>页面结构,渲染树>dom节点如何显示。一旦dom树和xuanrans构造完毕,浏览器就可以显示页面上的元素了。

    ps:渲染树的每个节点称为“框”或者“盒”,符合css模型的定义,将页面元素看做一个具有填充,边距边框和位置的盒

    当dom改变影响元素的几何属性(宽和高),浏览器需要重新计算元素的几何属性,其他元素的几何属性也因此受到影响,然后重构渲染树,这个过程称作重拍版

    不是所有dom操作都会影响几何属性,例如改变背景色,只需要重绘

    通过DOM事件处理用户相应

    事件有3个阶段:捕获,到达目标,冒泡

    优化:事件托管在父元素上,阻止冒泡等默认对你无用行为

    算法和流程控制

    1. 4中循环类型中,for-in性能最差,因为每次操作都要搜索实例或原型属性。
    2. 优化循环工作量的第一步是,减少对象成员或数组查找的次数

    3. 存储length

    4. forEach等基于函数的迭代虽然更加便利,但是要比基于循环(for等)的迭代要慢一些(一般慢8倍)。每个数组项要关联额外的韩式调用是造成速度慢的原因。

    5, 当比较数目很多时,switch表达式比if-else更快。

    6. if-else优化,应将最常见的条件放在首位,减少比较次数

    字符串和正则表达式

    在js中,正则是必不可少的东西,他的重要性远超过琐碎的字符串处理。

    1. 字符串拼接

    如下图:

    字符串常见拼接方式

    当连接少量字符串时,操作都很快。

    当字符串量多时:

    第二种比第一种快,因为第一种内存先创建一个临时字符串,最后再讲字符串赋给str。

    join 方法比其他方法都慢,因为他多了一个每个字符后插入一个空字符操作
    contact,比+ 和+=慢。

    2. 正则表达式

    原理:?

    响应UI

    一个用户点击操作后,浏览器执行2个任务:UI响应+js事件code运行已响应点击。

    js运行过慢会导致用户体验错乱和脱节。

    浏览器在js运行时间上采取了限制:

    1. 调用栈尺寸限制

    2. 长时间脚本限制:统计脚本运行的总时间, firefox 10s, safari 5s,chrome没有时间限制但使用崩溃检测系统来处理此类限制。达到限制时,浏览器会弹框提示是否继续运行。

    3. 接口最优应该在100ms内响应用户。

    优化: 用定时器先响应事件再执行任务,分解任务,限时运行任务(过了时间自动return)

    ajax异步JavaScript和XML

    有5种方法可向服务器发送请求: XHR,动态脚本标签插入,iframes,comet,multipart XHR。不同情况使用不同方法

    expires: get请求,告诉浏览器缓存多久

    编程实践

    避免重复代码:如浏览器检测

    num判断是否奇偶:num&1 == 1

    相关文章

      网友评论

          本文标题:读书笔记2,高性能JavaScript编程

          本文链接:https://www.haomeiwen.com/subject/cfcdeqtx.html