【问题标题】:Why does the modulo operator appear to work differently in FOR loops in javscript?为什么模运算符在 javascript 的 FOR 循环中的工作方式不同?
【发布时间】:2021-12-20 11:38:47
【问题描述】:

我正在制作一个简单的 javascript 函数,该函数接受一个字符串的输入并将其填充到最接近 8 的倍数。该函数有效,但似乎模运算符在 for 循环中的工作方式有所不同。例如:

var text = "abcdefghi"
if(text.length % 8 !== 0){
  var amt = 8 - (text.length % 8)
  for (let i = 0; i < amt; i++) {
    text = text + "#"
  } 
}
console.log(text)

返回:abcdefghi#######

但是:

var text = "abcdefghi"
if(text.length % 8 !== 0){
  for (let i = 0; i < text.length % 8; i++) {
    text = text + "#"
  }
}
console.log(text)

还返回:abcdefghi#######

根据我对模运算符 text.length % 8 = 1 的理解,给定 9 个字符的字符串输入。因此,为了将字符串填充为 16 个字符,我必须使用8 - (text.length % 8) = 7。当我将它放入它自己的变量中时,amt = 7 for 循环循环 7 次并正常工作。但是,当我在 for 循环中执行操作并删除 8 - 时,即使 text.length % 8 = 1 也会循环 7 次。有人可以解释这里发生了什么吗?

【问题讨论】:

  • 这是因为你在循环中改变了text的长度,而i &lt; text.length % 8的表达式会随着每次迭代而改变。

标签: javascript for-loop modulo


【解决方案1】:

for 循环将在每次循环运行时评估文本的长度。因此,如果您在循环中的文本末尾添加一个标签,当它再次评估长度时,它将看到文本比上次长一个。

所以基本上你是在添加文本而不是再次找到长度,当你在 for 循环之外获得文本的长度时,你会得到一个长度的常数,并且能够在 for 循环中准确地使用它。

举个例子,当你做恒定长度时,就像你在 for 循环之外的第一个例子中所做的那样,你有一个等式:

repeat until x = y

但如果你在 for 循环中进行计算,你会得到如下等式:

repeat until x = x + 1

这是行不通的,因为如果每次增加 x 时重新计算 x + 1 的值,x 不会等于自身 + 1。

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2019-07-03
    • 2020-08-02
    相关资源
    最近更新 更多