SyntaxError: for-in loop head declarations may not have initializers
JavaScript 严格模式下才会出现的异常“for-in 循环头声明不能包含初始化器”,表示 for...in 循环的头部包含一个初始化表达式,例如 for (var i = 0 in obj)。在严格模式下,for-in 循环中不允许这样做。此外,像 for (const i = 0 in obj) 这样带有初始化器的词法声明在非严格模式下也不允许。
消息
SyntaxError: for-in loop variable declaration may not have an initializer. (V8-based) SyntaxError: for-in loop head declarations may not have initializers (Firefox) SyntaxError: a lexical declaration in the head of a for-in loop can't have an initializer (Firefox) SyntaxError: Cannot assign to the loop variable inside a for-in loop header. (Safari)
错误类型
哪里出错了?
for...in 循环的头部包含一个初始化表达式。也就是说,声明了一个变量并赋值 for (var i = 0 in obj)。在非严格模式下,这个头部声明会被静默忽略,并表现为 for (var i in obj)。然而,在严格模式下,会抛出 SyntaxError。此外,像 for (const i = 0 in obj) 这样带有初始化器的词法声明在非严格模式下也不允许,并且始终会产生 SyntaxError。
示例
此示例将抛出 SyntaxError
js
const obj = { a: 1, b: 2, c: 3 };
for (const i = 0 in obj) {
console.log(obj[i]);
}
// SyntaxError: for-in loop head declarations may not have initializers
有效的 for-in 循环
你可以移除 for-in 循环头部的初始化器 (i = 0)。
js
const obj = { a: 1, b: 2, c: 3 };
for (const i in obj) {
console.log(obj[i]);
}
数组迭代
for...in 循环不应用于数组迭代。你是否打算使用 for 循环而不是 for-in 循环来迭代 Array?for 循环也允许你设置初始化器
js
const arr = ["a", "b", "c"];
for (let i = 2; i < arr.length; i++) {
console.log(arr[i]);
}
// "c"