js规范-计算

65 阅读2分钟

计算规范

计算规范

  • 避免全局查找
    访问全局变量始终比访问局部变量慢,因为必须 遍历作用域链。
    任何可以缩短遍历作用域链时间的举措都能提升代码性能。
    全局变量和函数相比于局部值始终是 最费时间的,因为需要经历作用域链查找
    只要函数中有引用超过两次的全局对象,就应该把这个对象保存为一个 局部变量。

       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请求要设置超时时间,针对超时需要做兼容处理

  • 对后端或外部变量采取不可信原则,先判断属性是否存在,再使用