SyntaxError: for-in loop head declarations may not have initializers

Виняток, що викидається лише у строгому режимі JavaScript, "for-in loop head declarations may not have initializers", виникає, коли шапка циклу for...in містить вираз ініціалізації, наприклад |for (var i = 0 in obj)|. Це не дозволено у циклах for-in у строгому режимі.

Повідомлення

SyntaxError: for-in loop head declarations cannot have an initializer (Edge)
SyntaxError: for-in loop head declarations may not have initializers (Firefox)
SyntaxError: for-in loop variable declaration may not have an initializer. (Chrome)

Тип помилки

SyntaxError лише у строгому режимі.

Що сталось?

Шапка циклу for...in містить вираз ініціалізації. Тобто, було оголошено змінну та присвоєно їй значення |for (var i = 0 in obj)|. У нестрогому режимі таке оголошення просто ігнорується та сприймається як |for (var i in obj)|. Однак, у строгому режимі викидається помилка SyntaxError.

Приклади

Цей приклад викидає помилку SyntaxError:

"use strict";

var obj = {a: 1, b: 2, c: 3 }; 

for (var i = 0 in obj) { 
  console.log(obj[i]);
}

// SyntaxError: for-in loop head declarations may not have initializers

Правильний цикл for-in

Ви можете прибрати ініціалізатор (i = 0) з шапки циклу for-in.

"use strict";

var obj = {a: 1, b: 2, c: 3 };

for (var i in obj) {
  console.log(obj[i]);
}

Перебір масиву

Цикл for...in не варто використовувати для перебору масиву. Чи намагались ви використати цикл for замість for-in для перебору масиву? Цикл for також дозволяє використання ініціалізатора:

var arr = [ "a", "b", "c" ] 

for (var i = 2; i < arr.length; i++) { 
  console.log(arr[i]); 
}

// "c"

Див. також

  • for...in
  • for...of – також не дозволяє ініціалізатор як у строгому, так і у нестрогому режимах.
  • for – найкращий для перебору масивів, дозволяє визначати ініціалізатор.