- 今天看到一段代码,实现两个比较大的数相加。当然有其他简单的方法解决,这里仅仅分析一下;
function sumString (a,b){
var res = '', c=0;
a = a.split('');
b = b.split('');
while(a.length || b.length || c){
console.log(c)
c += ~~a.pop() + ~~b.pop()
console.log(c)
res= c % 10 +res;
c = c > 9;
console.log('一次循环结束',c, res)
}
return res.replace(/^0+/, '')
}
console.log(sumString('23', '119'))
- 控制台结果
0
12
一次循环结束 true 2
true
4
一次循环结束 false 42
false
1
一次循环结束 false 142
142
- 分析一下
a = a.split(''); b = b.split('');
- 这里把两个数变成了两个数组 a= [2,3] b=[1,1,9]
while(a.length || b.length || c){
- 循环的条件 a数组 或者 b数组仍然有值,并且变量c(是一个判断有没有进1的变量)为true时继续进入里面了
c += ~~a.pop() + ~~b.pop()
- 这里 a.pop() 获取数组最后一项,并且原数组减少最后一项。
- ~~是取整 类似还有方法还有
*** 8.9|0
*** 8.9>>0
*** 8.9<<0 - c+= 等于 c = c+ ... 在这里 c为true为转换为1 false转换为0
res= c % 10 +res;
- res 保存着每一次循环之后的记录的值。从个位往高位保存;
c = c > 9;
- 每次循环后记录本次计算是否进一位。 其实我觉得写成这个样更有语义化
c = c > 9 ? 1 : 0;
return res.replace(/^0+/, '')
- 循环之后返回 去掉以0开始的多个连续0字符串;
-
第一次循环 3 + 9 = 12
res 为个位数 2 c由于大于9 为true -
第二吃循环 2 + 1 = 3
c = true + 2 + 1 相当于 1+2+1 = 4;
res 等于 4 + 上一次循环保存的个位数 2 = 42
c < 9 为 false
*第三次循环
[].pop() 为undefined ~~[].pop()为0
c = false + 0 + 1 = 1
res = 1+ 上次循环保存的两位数42 = 142
c<9 为false
- 此时 a.length ==0 b.length==0 c = false 跳出循环 返回 142
网友评论