写在前面,当初做深度合并的时候,写了有关于深度合并的相关业务,之后这里回顾下几个点。
业务流程上面基本是从页面拿到数据精度之后, 在页面上化为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,
当一个方法执行的时候,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的局部变量都是放在栈内存中的;在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常比较大),这个运行时数据区就是堆内存。堆内存不会随着方法的结束而销毁。
即方法结束后, 这个对象不会随方法的结束而销毁,即方法结束后,这个对象还可能被另一个引用变量所引用(在方法的参数传递时很常见),此时这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。
这一说法同时从侧面证实了递归会造成内存泄漏的正确性。
文章采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接。