双重求值
动态执行
eval(‘a1 + a2’)
new Function(‘arg1’, ‘arg2’, ‘return arg1 + arg2’)
setTimeout()
setInterval()
在js代码中执行另一段代码,会导致双重求值的性能损耗。
代码首先会正常求值,然后对包含字符串的代码发起另一个求值运算。
每次调用函数时都要创建一个新的解析器实例。
不过,优化后的js会缓存这些函数重复运行的代码
使用Object/Array直接量
let obj = new Obejct()
let arr = new Array()
// 直接量
let obj = {}
let arr = []
好处:运行速度快,减少代码量,减少文件尺寸。
避免重复工作
- 避免做无关紧要的工作
- 别重复做已经完成的工作
对策:
- 延迟加载。不会立即使用时。
- 条件预加载。整个页面生命周期中频繁出现,或者很快就要使用到。
使用速度快的部分
位操作
二进制表示法
number.toString(2) // 返回二进制
二进制中同位对比
- 按位与(1|1 返1
25 & 3 // 1 - 按位或(1|0 返1
25 | 3 // 27 - 按位异或(1 返1
25 ^ 3 // 26 - 按位取反(0 返1
~25 // -26
应用:
- 斑马线 i % 2 取模运算,使用i & 1 速度更快。
- 位掩码,用于处理同时存在多个布尔选项的情形。使用单个数字的每一位来判定是否选项成立。
从而有效的将数字转换为布尔值标记组成的数组。
掩码中的每个选项值比较是2的幂
let status_a = 1
let status_b = 2
let status_c = 4
let status_d = 6
let options = status_a | status_b | status_c | status_d
if(options & OPTION_A) { // 是否在options中
// ...
}
计算操作发生在底层。如果有多个选项保存一起并频繁检查,位掩码有助于提高整体性能。
此外还有左位移<<, 右位移>>,无符号右移等位操作符。
原生方法
原生方法最快,因为其会被编译成机器码,已经成为浏览器的一部分。
- 数学方法Math
- dom选择器
chrome对原生方法和js代码都使用了即时编译器,所以性能差别不大。