高性能Javascript读书总结

High Performance JavaScript(高性能JavaScript)读书笔记分析 High Performance JavaScript(高性能JavaScript)读书笔记,让你的js代码更有效率。 立即下载

1. 加载和执行

  • 尽量将所有的<script>标签放在</body>标签之前,确保脚本执行前页面已经完成了渲染,避免脚本的下载阻塞其他资源(例如图片)的下载。
  • 合并脚本,减少页面中的<script>标签
  • 使用<script>标签的defer和async属性(两者的区别见这里)

在这里插入图片描述

  • 通过Javascript动态创建<script>标签插入文档来下载,其不会影响页面其他进程

2.数据存取

  • 由于作用域链的机制,访问局部变量比访问跨作用域变量更快,因此在函数中若要多次访问跨作用域变量,则可以用局部变量保存。
  • 避免使用with语句,其会延长作用域链
  • 嵌套的对象成员会导致引擎搜索所有对象成员,避免使用嵌套,例如window.location.href
  • 对象的属性和方法在原型链的位置越深,访问的速度也越慢

3.Dom编程

  • 进行大段HTML更新时,推荐使用innerHTML,而不是DOM方法
  • HTML集合是一个与文档中元素绑定的类数组对象,其长度随着文档中元素的增减而动态变化,因此避免在每次循环中直接读取HTML集合的length,容易导致死循环
  • 使用节点的children属性,而不是childNodes属性,前者访问速度更快,且不包含空白文本和注释节点。
  • 浏览器的渲染过程包括构建DOM树和渲染树,当DOM元素的几何属性变化时,需要重新构造渲染树,这一过程称为“重排”,完成重排后,浏览器会重新绘制受影响的部分到屏幕中,这一过程称为“重绘”。因此应该尽量合并多次对DOM的修改,或者先将元素脱离文档流(display:none、文档片段),应用修改后,再插入文档中。
  • 每次浏览器的重排时都会产生消耗,大多数浏览器会通过队列化修改并批量执行来优化重排过程,可当访问元素offsetTop、scrollTop、clientTop、getComputedStyle等一系列布局属性时,会强制浏览器立即进行重排返回正确的值。因此不要在dom布局信息改变时,访问这些布局属性。
  • 当修改同个元素多个Css属性时,可以使用CssText属性进行一次性修改样式,减少浏览器重排和重绘的次数
  • 当元素发生动画时,可以使用绝对定位使其脱离文档流,动画结束后,再恢复定位。避免动画过程中浏览器反复重排文档流中的元素。
  • 多使用事件委托,减少监听事件

4.算法和流程控制

  • for循环和while循环性能差不多,除了for-in循环最慢(其要遍历原型链)
  • 循环中要减少对象成员及数组项的查询次数,可以通过倒序循环提高性能
  • 循环次数大于1000时,可运用Duff Devices减少迭代次数
  • switch比if-else快,但如果具有很多离散值时,可使用数组或对象来构建查找表
  • 递归可能会造成调用栈溢出,可将其改为循环迭代
  • 如果可以,对一些函数的计算结果进行缓存

5.字符串和正则表达式

  • 进行大量字符串的连接时,+和+=效率比数组的join方法要高
  • 当创建了一个正则表达式对象时,浏览器会验证你的表达式,然后将其转化为一个原生代码程序,用户执行匹配工作。当你将其赋值给变量时,可以避免重复执行该步骤。
  • 当正则进入使用状态时,首先要确定目标字符串的起始搜索位置(字符串的起始位置或正则表达式的lastIndex属性),之后正则表达式会逐个检查文本和正则模式,当一个特定的字元匹配失败时,正则表达式会试着回溯到之前尝试匹配的位置,然后尝试其他路径。如果正则表达式所有的可能路径都没有匹配到,其会将起始搜索位置下移一位,重新开始检查。如果字符串的每个字符都经历过检查,没有匹配成功,则宣布彻底失败。
  • 当正则表达式不那么具体时,例如.*和[\s\S]*等,很可能会出现回溯失控的情况,在js中可以应用预查模拟原子组(?=(pattern))\1来避免不必要的回溯。除此之外,嵌套的量词,例如/(A+A+)+B/在匹配"AAAAAAAA"时可能会造成惊人的回溯,应尽量避免使用嵌套的量词或使用预查模拟原子组消除回溯问题。
  • 将复杂的正则表达式拆分为多个简单的片段、正则以简单、必需的字元开始、减少分支数量|,有助于提高匹配的效率。

6.快速响应的用户界面

  • 单个JavaScript运算操作时间不应该超出100ms,否则可能会阻塞用户操作
  • 如果要执行长时间的运算,可以通过定时器将计算过程分割成多个步骤,使UI可以得到更新,例如
setTimeout(function(){
	process(todo.shift());

	if (todo.length > 0) {
		setTimeout(arguments.callee, 25);
	} else {
		callback();
	}
})
  • 较长时间的计算过程也可以按照代码运行的时间进行分割,每次控制运行的时间,例如
setTimeout(function(){
	let start = +new Date();
	do {
		process(todo.shift());
	} while(todo.length > 0 && (+new Date() - start) < 50)
	
	if (todo.length > 0) {
		setTimeout(arguments.callee, 25);
	} else {
		callback();
	}
})
  • 高频率重复的定时器数量尽量要少,建议使用一个独立的重复定时器
  • 使用WebWork进行计算

7. AJAX

  • 设置HTTP头部信息进行缓存,例如
Expires: Mon,28 Jul 2018 23:30:30 GMT
  • 对于一些函数的计算结果进行本地缓存

8. 编程实践

  • 避免使用eval、Function进行双重求值
  • 使用Object/Array字面量定义,不要使用构造函数
  • 使用延迟加载消除函数中重复的工作
  • 使用位操作,例如与1进行按位与计算,得到奇偶交替
if (i & 1) {
	className = 'odd';
} else {
	className = 'even';
}	
  • 多使用JS内置的原生方法,例如Math对象等

9.构建和部署

  • 合并、压缩多个js文件
  • 设置HTTP缓存
  • 使用内容分发网络CDN

10.性能分析工具

这本书的分析工具似乎有些已经过时了,这里推荐使用chrome浏览器自带的performance模块进行分析,感觉很不错,可以参考这篇文章


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全 本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。 阅读详情

相关推荐

详述字符集与汉字编码

字符集与字符编码是文本处理的基础概念。字符集定义字符集合(如ASCII、GB2312、Unicode),字符编码则规定字符如何存储为二进制数据。汉字编码经历了从区域化(GB2312、GBK、BIG5)到全球化(Unicode)的演进,Unicode通过UTF-8、UTF-16等编码方案实现跨语言兼容。UTF-8因兼容ASCII、节省空间且无乱码风险,成为中文互联网的主流编码。正确处理编码问题需统一标准、明确声明格式,并注意生僻字的特殊处理。

零零发不爱ai的博客 805

煮酒论JavaScript:使用“更好的”代码(高性能的密码)

本文是一篇纯干货前端分享,也算是笔者最近一段时间的思考总结。(顺便为1024庆祝!)

flying meng的菜鸟居 4109

四旋翼黑科技揭秘:如何利用PX4隐藏的角加速度数据提升控制性能

本文深入探讨了如何利用PX4飞控中隐藏的角加速度数据,结合增量非线性动态逆(INDI)控制方法,显著提升四旋翼无人机的控制性能。通过实战教程,指导开发者从数据订阅、INDI原理到代码实现,构建响应更快、鲁棒性更强的控制回路,有效应对突风与快速机动。

lake5的博客 720

《高性能JavaScript》(笔记)

一二三

qq_41622983的博客 248

【网格生成】Gmsh快速入门教程 --1.图形化界面使用

初探 Gmsh软件的主界面如下图所示。通过点击菜单“File” -> "Open"可选择打开已经存在的几何模型或网格文件,初次使用可选择tutorial目录下的t1.geo文件。打开后效果如图所示,t1.geo描述的是一个长方体。 接下来依次尝试左侧菜单栏的功能:Geometry(几何)、Mesh(求解器)。Solver模块需依赖外置求解器,不在本文介绍范围内。 Geometry 该菜单下是与几何相关的功能,如新增一个点/面、体,移动一个体等,具体功能很多可以在后续使用中逐渐尝试学习。本文仅介绍几个

DJ_xiaoming的博客 1万+

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程

本文为GNSS新手提供RTKLIB命令行程序实战指南,重点介绍如何通过`rnx2rtkp`后处理解算工具快速掌握GNSS解算全流程。从环境搭建、程序编译到核心算法解析,帮助读者理解RTKLIB源码结构,并通过真实数据处理案例演示完整解算过程,是入门GNSS定位技术的实用教程。

weixin_42524226的博客 359

2020-08-11

零基础的前端开发初学者应如何系统地学习? 在正文开始前,我还是先说一下我个人对于前端职业发展前景的看法。希望对那些站在前端学习起点,或者已经在路上,但犹豫不决的同学有所启发。 总的来说,到了2020年,初级前端在市场上是供大于求的,而高级前端依然是供小于求。这个判断主要是通过这些年面试的情况来看,没有全面的数据支撑,仅代表我个人观点。 初级前端供大于求。在培训机构和互联网公司的共同推动下,市场的初级前端很多。相比我2011年回答这个问题时,互联网公司在前端工程师的招聘要求高了很多。我毕业那年只是.

qianduan666a的博客 281

设计的多实例引用(Multiple Instances of a Design Reference)

一、什么是“设计的多实例引用” 在层次化的设计中,我们经常会将一个module例化多份,这些例化的instance就是设计的module的多实例引用。 二、为什么要解决多实例引用 三、怎么解决多实例引用 ...

kevindas的博客 3719

《高性能JavaScript》笔记总结

这本书一共有十个章节 1、加载和执行 2、数据存取 3、DOM编程 4、算法和流程控制 5、字符串和正则表达式 6、快速响应用户界面 7、Ajax 8、编程实践 9、构建并部署高性能JavaScript应用 10、工具 看完这本书的总结: 一、加载和执行 1、脚本是如何下载以及最佳位置? 脚本是串行加载的,一个脚本下载完成执行完之后另外一个脚本才会再进行下载执行。有些高版本的浏览器已经支持脚本的并...

Miss_hhl的博客 309

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

分类(Classification)属于有监督学习(Supervised Learning)中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。本章主要讲述分类算法基础概念,并结合决策树、KNN、SVM分类算法案例分析各类数据集,从而让读者学会使用Python分类算法分析自己的数据集,研究自己领域的知识,从而创造价值。 19.1 分类 19.1.1 分类模型 与前面讲述的聚类模型类似

杨秀璋的专栏 2万+

保姆级教程:ABAP 通过 HTTP POST 调用 OData 服务创建业务数据的具体例子

笔者之前的文章发布之后,有朋友在评论区留言,询问 ABAP 除了 Web Service 之外,是否也支持 HTTP 呢?ABAP 这么强大的语言,支持 HTTP 当然不在话下。网上有很多在 ABAP 系统基于 CL_HTTP_CLIENT 工具类,通过 HTTP 协议和第三方系统交互的代码例子。本文介绍笔者项目中一个实际例子,实现的是在 ABAP 系统 A 通过 HTTP 调用 OData 服务,在 ABAP 系统 B 创建业务数据的需求。下面我们按照这个套路来一步步实现。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 700

[js] 《高性能JavaScript》 读书笔记

Loading and Execution 加载和运行 一般来说浏览器中有多种线程:UI渲染线程、javascript引擎线程、浏览器事件触发线程、HTTP请求线程等。多线程之间会共享运行资源,浏览器的js会操作dom,影响渲染,所以js引擎线程和UI渲染线程是互斥的,导致执行js时会阻塞页面的渲染。 将<script>标签放在尽可能接近<body>标签底部的位...

aefg95955的博客 134

渗透测试面试题

渗透测试面试题 一.思路流程 1.信息收集 服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等) 子域名收集,旁站,C段等 google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等 扫描网站目录结构,爆后台,网站banner,测试文件,...

千寻的博客 12万+

《高性能JavaScript》读书笔记

最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践、性能优化类的书。记录下主要知识。 加载和执行 脚本位置 放在中的javascript文件会阻塞页面渲染:一般来说浏览器中有多种线程:UI渲染线程、javascript引擎线程、浏览器事件触发线程、HTTP请求线程等。多线程之间会共享运行资源,浏览器的js会操作dom,影响渲染,所以

任乃千的博客 654

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《高性能JavaScript》读书笔记(全)

字符串和正则表达式也会影响代码的性能,如果遇到字符串拼接时,可以用模板字符串来进行拼接,而非普通字符串拼接。例如,当一个父元素包含多个子元素,且每个子元素都需要绑定点击事件时,可以将事件处理程序绑定到父元素,通过事件对象的 target 属性判断具体触发事件的子元素。通过将事件处理程序绑定到父元素,可以统一处理多个子元素的事件。这章节主要讲解的是如何写出更优质的代码,如何有一个更好的代码规范,保持代码风格的一致性。:脚本加载完成后立即执行,执行顺序与加载顺序无关,因此可能会出现脚本执行顺序不一致的情况。

lplovewjm的博客 779

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《高性能javascript》读书笔记--js脚本的加载与执行

第一章 加载与执行 JS在浏览器中的性能,可以认为是开放者面临的最重要可用性问题。 JS的阻塞性————多数浏览器使用单一进程处理UI和脚本,意味着标签的出现会让页面等待脚本的执行(内嵌和外链),脚本执行时间越长,浏览器响应越慢。 1. 脚本位置 html规范指出标签可以放在或者中,并允许出现多次。理论上讲,在中加载JS和CSS,有助于确保页面和交互的正确性。 目前的浏览器基本都

公举小白的博客 307

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

高性能Javascript 读书笔记

最近看了《高性能JavaScript》一书,里面有讲很多提高js性能的书,所以根据个人见解记下一些我觉得有用的有意思的点,供以后学习参考。 前言:尽管现在已经发展出了各种方法,压缩,合并、模块化等加载方式,以及强大的JS处理引擎提高js性能,但仍有一些javascript引擎力不能及的地方:DOM交互、网络延迟、JavaScript的阻塞和并发下载等。

今晚打老斧的博客 566

JavaScript之 高性能读书笔记

1.当浏览器在执行javascript代码时,不能同时做其它任何事情。大多数浏览器都使用单一进程来处理用户界面更新和javascript脚本执行。 2.雅虎特别性能小组http://developer.yahoo.com/performance/ 3.标签可以在或中。 4.推荐将所有标签放在body标签的底部 5.减少页面中外链脚本文件的数量将会改善性能。 6.无阻塞的脚本: a.延迟

stephen的专栏 928

【读书笔记】高性能JavaScript:最小化重排和重绘

【读书笔记】高性能JavaScript:最小化重排和重绘 当浏览器下载完所有组件后,会生成两个树: DOM树和渲染树,DOM树描述的是节点的结构,而渲染树则描述DOM树如何展示,所以DOM树的变化会影响渲染树。 当我们的DOM操作影响了元素的几何属性,比如说宽高。浏览器会使渲染树中受影响部分失效,并且重新构造渲染树,这个过程叫做重排,重排结束后,浏览器会重新渲染受影响部分内容到屏幕,这过程叫做重绘。 而重排和重绘都会造成严重的性能消耗。 解决这部分问题主要有三种方式: 1、改变元素的display属性,从文

ffan1的博客 242

读书总结:高性能JavaScript

读高性能JavaScript 总结: 先谈谈自己的感受,在前端行业高速发展的这几年,前端JS性能一直努力榨取,读本书后觉得性能问题可以从一下方面入手: 本书以章节形式总结: 第一章:加载和执行 在页面中script标签越少越好 尽量确保脚本执行前页面已经完成渲染 使用无阻塞方式下载java...

chenmalian5192的博客 202

《高性能javascript》读书笔记

此书主要从js语法层面,算法,浏览器渲染机制,网络传输HTTP、XHR,项目创建和部署方面给与高性能网站的优化方式。 一、加载和运行 1.javascript阻塞dom渲染,尽量放在body底部。可以组合外接javascript,数量多性能更慢。 保持javascript文件小。//window.onload之后开始下载脚本。 不改变dom的脚本使用defered属性,其会异步下载,并

weixin_40821790的博客 399

高性能JavaScript 读书笔记

第一章:加载和执行 浏览器的JavaScript的引擎是编译器层的优化; 当浏览器执行JavaScript代码时,不能同时做其他任何事情(单一进程),意味着<script>标签每次出现都霸道地让页面等带脚本的解析和执行(每个文件必须等到前一个文件下载并执行完成才会开始下载),所以头部的JS和CSS用来渲染页面,交互行为(几乎所有)的JS放在<body>底部; 主流...

weixin_30270561的博客 68

月读书系列-高性能JavaScript

第一章、加载和执行 1.1、脚本的位置 由于javascript脚本会阻塞页面其他资源的下载,因此推荐将所有的script标签尽可能放到body标签的底部,以尽量减少对整个页面下载的影响 1.2、合并脚本 尽量减少页面中外链脚本文件的数量,也会改善性能,因此构建器才会最终把js文件都打包成一个文件(下载单个100kb文件将比下载4个25kb文件更快) 1.3、无阻塞脚本 1.3.1、延迟脚本 HTML4中为script标签定义了一个扩展属性defer,该属性表明本脚本不会修改DOM,因为此代码可以安全的延迟

Ronychen的博客 504

【前端性能优化】高性能JavaScript读书笔记

序曾经看过一篇文章,有一句话这样说:只有在大学的图书馆里,你才能真正赚回你交的学费。临近毕业,还想再去图书馆多转转。偶然在架子上发现了这本书,一看作者是写大名鼎鼎的红宝书的人,就很感兴趣。再者,最近用 JavaScript 刷 LeetCode 发现,提交显示 JavaScript 要比 Go 语言或 Python 有更大的时间和内存消耗,也使我把了解 JavaScript 内存机制和性能优化提上...

weixin_33713707的博客 273
上一篇: 列表懒加载滚动scroll事件不断自动触发问题
下一篇: D3 二维图表的绘制系列(三十二)可缩放的封闭图
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值