【问题标题】:Javascript For Final Expression does not allow complex statements. Why?最终表达式的 Javascript 不允许复杂的语句。为什么?
【发布时间】:2017-04-22 04:58:06
【问题描述】:

除了原因,我发现了以下几点:

var lines = ["Line 1", "Line 2", "Line 3"], i = 0, line;

for (line[i]; i < lines.length; line = lines[i++]) {
     console.log(line); //Outputs "Line 1" three times
}

for (line[i]; i < lines.length; i++, line = lines[i]) {
     console.log(line); //Outputs "Line 1", "Line 2", "Line 3"
}

唯一的区别是将 final-expression 语句中的 i++ 分隔成两个用逗号分隔的语句(谁想到了这种语法,顺便说一句?!多个语句不应该用分号分隔并用 {} 包裹吗?就像我们在其他地方使用一样?我离题了......)那么是什么给了Javascript? line=lines[i++] 在你环绕那个循环时对你来说太复杂了吗?

在有人问我为什么不能把 line=lines[i] 放在循环的顶部之前:因为第一个例子很优雅。它使事物分开。

所以我的问题是:为什么,Javascript,为什么?

【问题讨论】:

  • 这是什么for循环?
  • 两个循环都无法运行line is undefined
  • 有时它不是语言,而是你如何使用它让你感觉WTF...

标签: javascript loops for-loop expression


【解决方案1】:

您发布的代码没有运行。

每个 for 循环的开始

 for (line[i]; 

没有意义。

也许你的意思

 for (line = lines[i];

?

var lines = ["Line 1", "Line 2", "Line 3"], i = 0, line;

for (line = lines[i]; i < lines.length; line = lines[i++]) {
     console.log(line); //Outputs "Line 1" three times
}

i = 0;
for (line = lines[i]; i < lines.length; i++, line = lines[i]) {
     console.log(line); //Outputs "Line 1", "Line 2", "Line 3"
}

在这种情况下,情况 1 打印出来

line 1
line 1
line 2

案例 2 打印

line 1
line 2
line 3

至于为什么,i++的意思是

temp = i;
i = i + 1;
return temp;

所以在第一种情况下如果 i = 0 这部分

line = lines[i++]

会这样

line = lines[0], i = i + 1

因为 temp 在示例中 i++ 的实际含义是 0 在它被使用的时候。

而在第二种情况下

i++, line = lines[i]

您在使用前进行后增量

要明确i++ 这称为后递增。表达式的值是递增之前的值

如果您实际上是指 increment 而不是 postincrement,请使用 ++i

至于优雅,这是一种意见。目前尚不清楚您要做什么,当然有理由使用基于索引的循环,但以防万一这里有一些其他的迭代方式

var lines = ["Line 1", "Line 2", "Line 3"];

// use a function
lines.forEach(function(line) {
   console.log(line);
});

// use a function with arrow syntax
lines.forEach(line => {
   console.log(line);
});

// and of course if you really want to use indices why is
// this not elegant?
for (let i = 0, len = lines.length; i < len; ++i) {
  const line = lines[i];
  console.log(line);
}

我不清楚为什么你认为你的解决方案很优雅。我会查看您的解决方案并认为它被混淆了。换句话说,难懂难懂不优雅。

【讨论】:

  • for (line = lines[i]; i &lt; lines.length; line = lines[++i]) { 将按要求工作
  • 是的,当然,这就是为什么我解释了 ++ii++ 并希望这很明显
  • 我一定在答案中错过了这一点
  • 好点。我希望人们遵循这个逻辑。如果我解释 i++ 返回 0 以及为什么这是导致错误的原因,然后我解释 ++i 将返回增加的值,我希望它们连接点。我的错。
  • 是的,对不起,第一部分应该是line = lines[i];。 i++ vs ++i 现在完全有意义了。我不应该意识到这一点。至于背后的原因......在这种情况下,我需要在数组中向前跳过并继续运行更多代码。所以我可以在循环内使用line = lines[++i] 来推进线路而不循环。 forEach 不能这样做。此外, forEach 非常慢。感谢 gman 的详细解释以及其他所有参与进来的人。
【解决方案2】:

Javascript For Final Expression 不允许复杂的语句。为什么?

您回答了自己的问题。 final-expression 是一个表达式,而不是一个语句。这就是语言的设计方式。它可以追溯到四十年前的 C 中的逗号运算符,如果不是更进一步的话。

如果你想在for 中分配line,你可以这样写你的循环:

const lines = [1, 2, 3];

for (let i = 0, line; line = lines[i], i < lines.length; i++) {
  console.log(line);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多