当前位置: 首页 > 知识库问答 >
问题:

javascript - js中for循环中i++写在代码块中和写在括号中的区别是什么?

慕容光启
2023-05-08

描述

for循环是最基础的知识点,但是多年后发现我并没有吃透。
常规的写法大家都理解,就不说了;但是当把i++写在代码块中时,发现多执行了一次,这是为什么,哪位大神能否讲解下。

image.png
从上图中可以看出,结果多输出了一次。
另外第一次也是输出三次,但是最后一个是undefined的,开始我以为是i访问不到了,返回的undefined的,结果不是,看下面截图
image.png
我输出i的时候,加了个前缀,结果是没有的,说明输出的不是console.log的内容,说明这是for的输出,下面也证明了
image.png
直接一个空的for也有undefined

问题

  1. i++写在代码块中为什么会多执行一次?
  2. 那个undefined是从哪输出的?

补充

本来计算下面的情况,熬夜熬猛了,忘了等于的情况了,我说for怎么突然和我的理解不一致了[捂脸]

const aa = ["0", "1", "2", "3", "4", "5"];
for (let i = 0,len=aa.length; i < len; i = Math.min(i + 5, len)) {
  let list = aa.slice(i, i + 5);
  console.log(list);
}

共有2个答案

张鸿宝
2023-05-08

    在Node.js的交互式命令行中(其他编程语言比如Python),每次执行语句都会返回一个值,这是因为REPL (read-eval-print loop)在运行代码时自动将代码包裹在一个函数中并执行它,然后返回函数的返回值。它是一个简单的,交互式的编程环境,有时候翻译成交互式解释器。就是你往REPL里输入一行代码,它立即给你执行结果。而不用像C++, Java那样通常需要编译才能看到运行结果。
    如果你在REPL中输入一个表达式,比如 1+1,它将自动包裹在一个函数中并返回表达式的值。同样,如果你定义了一个函数并在REPL中调用它,该函数的返回值也会被返回给你。这个功能让你能够方便地测试代码并检查它们的输出,因为你不需要明确地指定任何返回值。
    所以并不是代码多执行了一次,只是因为这个机制造成的假象而已。
    如果你把第二个for循环写在一个js文件里,再通过node 文件名.js的方式执行,还是只会执行两次输出语句的。
image.png
image.png

罗昱
2023-05-08

没有多执行吧,最后一个1是返回值

 类似资料:
  • 问题内容: 我今天发现了一件奇怪的事情,想知道是否有人可以阐明其中的区别? 运行完每个循环后,没有改变,但是在每个元素中添加了一个。我实际上使用该版本在循环内写入初始化的NumPy数组。 问题答案: 不同之处在于,一个修改数据结构本身(就地操作),而另一个仅 重新分配 变量。 仅出于完整性考虑: 是 不是总是 做就地操作,有(至少)三种例外情况: 如果 没有实现 的则方法的声明仅仅是一个速记。如果

  • 我在解析JSON对象时发现了这段示例代码,我对它有点了解,但希望得到更详细的解释: 我知道这是拆分记录,以得到单个记录由新的行字符,但我想知道为什么它看起来这么复杂?是不是我们不能有这样的东西: 那么括号做什么呢?为什么我们在 谢谢

  • 问题内容: 我正在解析JSON对象,并找到了我理解的示例代码行,但希望您对以下内容进行更详细的说明: 我知道它是通过换行符来拆分记录以获得单个记录,但是我想知道为什么它看起来如此复杂?我们不能有这样的情况吗: 那么括号[]的作用是什么?为什么我们有两次x 谢谢 问题答案: 您的示例中的“方括号”从旧列表中构建了一个新列表,这称为列表理解。 的基本思想是: 的可以是任何表达式,含有或没有。

  • 问题内容: 我在new.txt中有10行文字,例如Adam:8154 George:5234等等。现在我想要一个仅包含名称的文本文件。xyz.txt必须包含Adam George等。现在上面的代码只给我留下了第十个名字。 如何在一个文本文件中包含所有10个名称。 问题答案: 那是因为您在for循环中打开,写入和关闭文件10次 您应该在循环外打开和关闭文件。 您还应该注意 使用write行 而 不是

  • } 链接:https://www.hackerrank.com/challenges/java-string-compare/problem