VueBloghyhero6

关于业务的深度合并一下简单的回顾和内存GC回收

2019-12-02 / 2019-12-03 / 572次浏览

写在前面,当初做深度合并的时候,写了有关于深度合并的相关业务,之后这里回顾下几个点。

业务流程上面基本是从页面拿到数据精度之后, 在页面上化为6挡,

2位小数,1位小数,1位整数,2位整数,3位整数,4位整数 , 这样合并为6挡向前推进的。

 // todo 处理当前深度,拆对应的 select
  depthHtml (num) {
    let result = []
    for (let i = 0; i < 6; i++) {
      if ((num - i) <= 0) { // 新建数组,设置不同类型。
        result.push({ text: (Math.abs(num - i) + 1) + vTradeTrans.bitInteger, number: (num - i) })
      } else {
        result.push({ text: (Math.abs(num - i)) + vTradeTrans.potentialDecimal, number: (num - i) })
      }
    }
    return result
  }

这个函数就是拆对函数,把精度化为深度,

还有一个另外值得注意的点就是,

整数档位和小数档位要进行拆开计算,

    const getNum = function (num1, num2) {
      let result = ''
      if (type === 'asks') { // todo 这个位置还要拆档,如果是1位整数的时候不用这个函数
        result = gScientificToNumber(
          Math.ceil(accMul(gScientificToNumber(num1), obj[num2])) / obj[num2]
        )
      } else {
        result = gScientificToNumber(
          Math.floor(accMul(gScientificToNumber(num1), obj[num2])) / obj[num2]
        )
      }
      return result
    }
    // todo 整数类型的转换置换
    const getConstantInt = function (num1, num2) {
      let result = ''
      if (type === 'asks') { // todo 这个位置还要拆档,如果是1位整数的时候不用这个函数
        result = Math.ceil(accDiv(gScientificToNumber(num1), obj[num2])) * obj[num2] // 精准除法
      } else {
        result = Math.floor(accDiv(gScientificToNumber(num1), obj[num2])) * obj[num2]
      }
      return Number(result).toString() // 整数位转字符串用于下面判定相等
    }

因为俩个档位的计算逻辑是不一致的,这个点确实需要注意,进位舍位没有进行fixed 4 舍5 入操作,而是采用了地板函数和 天花板函数进行操作。

最后业务的补位操作在,

newArry.forEach(function (currentValue, index, arr) { // todo 在此位置在进行保留位数
      currentValue.price_ = Number(currentValue.price_).toFixed(depthNum).toString()
      if (Number(currentValue.price_) === 0) {
        currentValue.price_ = parseFloat(0).toFixed(depthNum).toString()
      }
    })

也就是在

currentValue.price_ = Number(currentValue.price_).toFixed(depthNum).toString()

涉及到了转字符串在转函数的这么几个拉回操作。

本质上就函数角度来说这俩个函数处理的方式确实是不够优雅的,从业务的处理角度来说尚可。

剩下说一下没有说完的GC垃圾回收,之前看网上的一些文章,发文比对过这些东西,说GC 类似于回收的私人女仆。 确实JS 接触回收比较的少,但是还是作为适当的了解提一下,后续可能想到更好的还会继续补充。

简单聊俩句GC,

当一个方法执行的时候,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的局部变量都是放在栈内存中的;在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常比较大),这个运行时数据区就是堆内存。堆内存不会随着方法的结束而销毁。

即方法结束后, 这个对象不会随方法的结束而销毁,即方法结束后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),此时这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。

这一说法同时从侧面证实了递归会造成内存泄漏的正确性。

JS基础