为什么JavaScript的for循环中模运算符看起来表现与预期不符?
问题原因
你遇到的现象和模运算符本身无关,是for循环的终止条件会在每一轮循环开始前重新求值导致的:
- 第一段代码里你提前把需要补的长度算好存在
amt变量里,这个值只计算一次,固定为7,所以循环刚好执行7次,符合预期。 - 第二段代码你把
text.length % 8直接写在终止条件里,每轮循环都会重新计算这个值,而你每次循环都会修改text的长度,导致模运算的结果也同步变化:- 初始长度9:
9%8=1,i=0 < 1,补1个#,长度变为10 - 长度10:
10%8=2,i=1 < 2,补1个#,长度变为11 - 长度11:
11%8=3,i=2 < 3,补1个#,长度变为12 - 长度12:
12%8=4,i=3 < 4,补1个#,长度变为13 - 长度13:
13%8=5,i=4 < 5,补1个#,长度变为14 - 长度14:
14%8=6,i=5 < 6,补1个#,长度变为15 - 长度15:
15%8=7,i=6 < 7,补1个#,长度变为16 - 长度16:
16%8=0,i=7 < 0 不成立,循环终止
总共刚好执行7次循环,所以结果和第一段代码一致。
- 初始长度9:
修正方案
如果要让第二种写法按你的预期只循环1次,只需要提前把模运算的结果存为常量,不要每次循环都重新计算即可:
var text = "abcdefghi" var remainder = text.length % 8 if(remainder !== 0){ for (let i = 0; i < remainder; i++) { text = text + "#" } } console.log(text) // 输出abcdefghi#
内容的提问来源于stack exchange,提问作者Odoug4
相关产品推荐
相关产品推荐

