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

时间:2017-04-22 04:58:06

标签: javascript loops for-loop expression

除了原因之外,我发现了以下内容:

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"
}

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

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

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

2 个答案:

答案 0 :(得分:1)

您发布的代码无法运行。

每个for循环的开头

 for (line[i]; 

毫无意义。

也许你的意思

 for (line = lines[i];

&#13;
&#13;
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"
}
&#13;
&#13;
&#13;

在这种情况下,案例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++

而在第二种情况下

++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); }这称为后递增。表达式的值是之前的值增加

如果你的意思是增量而不是 postincrement ,请使用 private void btn_Login_Click(object sender, EventArgs e) { connection.Open(); OleDbCommand command= new OleDbCommand(); command.Connection=connection; command.CommandText="Select * from EmployeeData where Username ='"+txt_Username.Text+"' and Password='"+ txt_Password.Text+"'"; OleDbDataReader reader= command.ExecuteReader(); int count=0; while(reader.Read()); { count =count+1; } if (count == 1) { MessageBox.Show("Username and password is correct"); } else if(count > 0) { MessageBox.Show("Username or password is NOT correct"); } connection.Close(); }

至于优雅,那是一种观点。我们不清楚你要做什么,并且肯定有理由使用基于索引的循环,但以防万一其他方式迭代

&#13;
&#13;
iterator = iter(a)
while True:
    try:
        a[-1] = next(iterator)
        print a[-1]
    except StopIteration as e:
        break
&#13;
&#13;
&#13;

我不清楚为什么你认为你的解决方案很优雅。我会看看你的解决方案并认为它是晦涩难懂的。换句话说,它难以理解,难以理解并不优雅。

答案 1 :(得分:0)

  

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

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

如果您想在line内分配for,可以这样编写循环:

&#13;
&#13;
const lines = [1, 2, 3];

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