为什么 for-in 循环不能有多个变量声明?
Why for-in loops can't have multiple variable declarations?
let example = {
a:20,
b:40,
c:60
}
for(let j=0,i in example){
console.log(example[i]*j);
j++;
}
为什么普通的for循环可以有多个变量声明,而for-in循环却不能?还是我做错了?
您编写的代码在语法上不正确。
in JavaScript you cannot use for-in
expression with any other assignment expression.
您可以简单地从 for 循环中取出 j=0
赋值,这应该可以修复错误
let example = {
a:20,
b:40,
c:60
}
let j=0
for(i in example){
console.log(example[i]*j);
j++;
}
[编辑] 我在官方 MDN 站点中找到了相同场景的以下内容
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
根据网站 - 这是一个众所周知的问题,ChromeV8 和其他浏览器正在尝试调查
有关详细信息,请查看以下参考资料
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_for-in_initializer
https://bugzilla.mozilla.org/show_bug.cgi?id=748550
https://bugzilla.mozilla.org/show_bug.cgi?id=1164741
我尝试更改您的代码以不在 for 循环的括号内声明任何变量。我从未见过这样做;也许这是可能的,但在 for 循环之上声明一个变量会更简单,就像这样(假设这是你希望做的):
let example = {
a:20,
b:40,
c:60
}
let j=0
for(let i in example){
console.log(example[i]*j);
j++;
}
编辑: 如评论中所述:"You should probably add a let
before the i
declaration, otherwise it's going to be globally defined." 我刚刚在代码段中更改了它!
我能理解这种挫败感,您使用的是相同的关键字,为什么它的行为不相似?但我认为你应该这样想:
for 是一种定义循环的方式,只要某些条件为真,对于如何定义该条件有不同的方式。
在常规 for 循环中,只要中间部分(条件)为真,就循环:
for(let i = 0; i < 10; i++)
这类似于 while 循环的工作方式,但它是一种语法捷径:
let i = 0;
while (i < 10) {
i++;
}
所以 for..in 是一个 for 循环,它有另一种条件,对于这个对象中的每个 属性,所以只要你有更多的属性,它就会继续循环。
你也可以这样写:
const keys = Object.keys(example);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const value = example[key];
}
你还有 for...of,它循环遍历数组中的项目,但这是语法糖 for:
for(let i = 0; i < array.length; i++) { const item = array[i]; }
还要考虑 do...while 循环与 while 循环的相似之处,但规则和行为略有不同。与其对语法感到沮丧,不如尝试了解它如何通过减少代码的冗长来节省您的时间,但为了做到这一点,每种情况都需要有所不同。另一种方法是使用很多语言关键字。
let example = {
a:20,
b:40,
c:60
}
for(let j=0,i in example){
console.log(example[i]*j);
j++;
}
为什么普通的for循环可以有多个变量声明,而for-in循环却不能?还是我做错了?
您编写的代码在语法上不正确。
in JavaScript you cannot use
for-in
expression with any other assignment expression.
您可以简单地从 for 循环中取出 j=0
赋值,这应该可以修复错误
let example = {
a:20,
b:40,
c:60
}
let j=0
for(i in example){
console.log(example[i]*j);
j++;
}
[编辑] 我在官方 MDN 站点中找到了相同场景的以下内容
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
根据网站 - 这是一个众所周知的问题,ChromeV8 和其他浏览器正在尝试调查
有关详细信息,请查看以下参考资料
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_for-in_initializer
https://bugzilla.mozilla.org/show_bug.cgi?id=748550
https://bugzilla.mozilla.org/show_bug.cgi?id=1164741
我尝试更改您的代码以不在 for 循环的括号内声明任何变量。我从未见过这样做;也许这是可能的,但在 for 循环之上声明一个变量会更简单,就像这样(假设这是你希望做的):
let example = {
a:20,
b:40,
c:60
}
let j=0
for(let i in example){
console.log(example[i]*j);
j++;
}
编辑: 如评论中所述:"You should probably add a let
before the i
declaration, otherwise it's going to be globally defined." 我刚刚在代码段中更改了它!
我能理解这种挫败感,您使用的是相同的关键字,为什么它的行为不相似?但我认为你应该这样想:
for 是一种定义循环的方式,只要某些条件为真,对于如何定义该条件有不同的方式。
在常规 for 循环中,只要中间部分(条件)为真,就循环:
for(let i = 0; i < 10; i++)
这类似于 while 循环的工作方式,但它是一种语法捷径:
let i = 0;
while (i < 10) {
i++;
}
所以 for..in 是一个 for 循环,它有另一种条件,对于这个对象中的每个 属性,所以只要你有更多的属性,它就会继续循环。 你也可以这样写:
const keys = Object.keys(example);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const value = example[key];
}
你还有 for...of,它循环遍历数组中的项目,但这是语法糖 for:
for(let i = 0; i < array.length; i++) { const item = array[i]; }
还要考虑 do...while 循环与 while 循环的相似之处,但规则和行为略有不同。与其对语法感到沮丧,不如尝试了解它如何通过减少代码的冗长来节省您的时间,但为了做到这一点,每种情况都需要有所不同。另一种方法是使用很多语言关键字。