重写JavaScript遇难题:如何改写含内联代码的for循环?
拆解并改写复杂的JavaScript for循环
原代码把多段逻辑塞进了for循环的条件判断里,可读性极差,尤其是逗号运算符和短路逻辑的组合:
for (var i = 0; i < b.data.byteLength && !(pos >= offset && (data.setUint8(idx, actualView.getUint8(i)), ++idx >= length)); i++) { pos++; }
先拆解原循环的核心逻辑
这个循环实际做了这些事:
- 从
i=0开始遍历,满足以下任意一个条件就终止循环:i等于或超过b.data.byteLength- 当
pos >= offset时,执行data.setUint8(idx, actualView.getUint8(i))赋值操作,随后idx自增1;若自增后的idx >= length,循环直接终止
- 每执行一次循环体,
pos都会自增1
改写后的代码(无内联逻辑)
把所有内联操作移到循环体内,用直白的条件判断替代复杂的短路逻辑,两种写法任选:
写法1:while循环(逻辑最清晰)
var i = 0; while (i < b.data.byteLength) { pos++; if (pos >= offset) { data.setUint8(idx, actualView.getUint8(i)); idx++; if (idx >= length) { break; } } i++; }
写法2:for循环(保留原循环结构)
for (var i = 0; i < b.data.byteLength; i++) { pos++; if (pos >= offset) { data.setUint8(idx, actualView.getUint8(i)); idx++; if (idx >= length) { break; } } }
改写说明
改写后的代码和原逻辑完全一致,但可读性大幅提升:
- 把原循环条件里的赋值、自增、判断全部拆成独立的语句
- 用
if+break替代了原代码里的短路终止逻辑 - 所有操作的执行顺序和原代码完全匹配
内容的提问来源于stack exchange,提问作者Flaminio
相关产品推荐
相关产品推荐

