计算规范
计算规范
-
避免全局查找
访问全局变量始终比访问局部变量慢,因为必须 遍历作用域链。
任何可以缩短遍历作用域链时间的举措都能提升代码性能。
全局变量和函数相比于局部值始终是 最费时间的,因为需要经历作用域链查找
只要函数中有引用超过两次的全局对象,就应该把这个对象保存为一个 局部变量。bad : ❌ function updateUI() { let imgs = document.getElementsByTagName("img"); for (let i = 0, len = imgs.length; i < len; i++) { imgs[i].title = '${document.title} image ${i}'; } let msg = document.getElementById("msg"); msg.innerHTML = 'Update complete.'; } good ✅ function updateUI() { let doc = document; let imgs = doc.getElementsByTagName("img"); for (let i = 0, len = imgs.length; i < len; i++) { imgs[i].title = '${doc.title} image ${i}'; } let msg = doc.getElementById("msg"); msg.innerHTML = 'Update complete.'; } good ✅ function getElements(name){ if(!getElements.cache) getElements.cache = {}; return getElements.cache[name] = getElements.cache[name] || document.getElementsByTagName(name); } //缓存记忆DOM元素,能提升5倍的性能 -
浮点运算不可靠,0.1+0.2 != 0.3 , 要引入库来处理
bad : ❌ console.log(0.1+0.2); // 输出 0.30000000000000004 18.9 * 100 = 1889.9999999999998 0.1 + 0.2 === 0.3 // false (function (a, b, c) { return a + b + c === a + ( b + c ) })(0.1, 0.2, 0.3) // false good ✅ 推荐使用big.js这个库,目前同类型最小包、无依赖、包大小3 KB、兼容ECMAScript 3+可以说适用于所有浏览器 let x = new Big(0.1) let y = new Big(0.2) let z = new Big(0.3) x.plus(y).eq(z) // true -
大数计算要考虑溢出,可以考虑用BigInt类型
JS整数最大位15位bad : ❌ const y = 9999999999999999; console.log(y) // 输出 10000000000000000 good ✅ const y = 9999999999999999n; const sum = y+ 2n; console.log(sum) // 输出:10000000000000001n -
日期处理,兼容性问题
new Date()使⽤在IOS有兼容问题 现象: new Date(“2018-12-12 00:00:01”).getTime() 获取时间戳的时候在ios下⾯为NaN. ⽅案:new Date("2018/12/12 00:00:01").getTime() 时间字符串比较(时间形式注意补0) 比较时间先后顺序可以使用字符串: var a = "2014-08-08"; var b = "2014-09-09"; console.log(a>b, a<b); // false true console.log("21:00"<"09:10"); // false console.log("21:00"<"9:10"); // true 时间形式注意补0 因为字符串比较大小是按照字符串从左到右每个字符的charCode来的, 所以特别要注意时间形式注意补0 -
ajax请求要设置超时时间,针对超时需要做兼容处理
-
对后端或外部变量采取不可信原则,先判断属性是否存在,再使用