В чем разница между циклом for и циклом for ..of?

#javascript #for-loop

#javascript #for-цикл

Вопрос:

В чем основное различие между for циклами и for..of циклами в контексте итерации по массиву?

Почему этот код

 for (let n of at.neighbours) {
  DFS(n);
}
  

выдавать выходные данные, отличные от этого кода?

 for (let i = 0; i < at.neighbours.length; i  ) {
  n = at.neighbours[i]
  DFS(n);
}
  

Кстати, это моя функция:

 function DFS(at) {
  if (at.visited) return;
  at.visited = true
  
  // for (let i = 0; i < at.neighbours.length; i  ) {
  //   n = at.neighbours[i]
  //   DFS(n);
  // }
  
  // This gives desired output
  for (let n of at.neighbours) {
    DFS(n);
  }
}
  

Комментарии:

1. for...of больше похоже на forEach() , for больше похоже for...in

2. нет, просто синтаксический сахар, чтобы сделать код более читаемым, когда вы видите, for...of или for...in вы уже знаете, что вы будете читать элемент за элементом, вероятно, от начала до конца, в линейном порядке

3. Чао, извините, но когда в for (let …) вы вызываете функцию DFS, должно быть neighbours[i].at или я ошибаюсь? Как neighbours это выглядит?

4. for..of является более общим, уменьшает беспорядок и изменяемое состояние и позволяет цели определять, как оно должно быть повторено. Последнее очень важно.

5. alligator.io/js/for-of-for-in-loops

Ответ №1:

Основное различие

for оператор позволяет выполнять итерации по повторяющимся объектам, одновременно управляя начальным и конечным условием.

for...of также может использоваться для перебора повторяющихся объектов (массивов и массивоподобных объектов, а также определяемых пользователем повторяющихся объектов). Операция выполняется для значения каждого отдельного свойства, если только она не завершается использованием ключевых слов break , return или throw .

forEach метод доступен как прототип метода итеративных объектов, но он выполняется для каждого элемента, если не выдается ошибка. (В идеале следует использовать, только если операция должна выполняться над каждым элементом)

С точки зрения производительности,

for оператор превосходит все другие операторы итерации. Обратитесь к этому

С точки зрения поддержки,

  • for оператор широко поддерживается во всех браузерах. Ссылка
  • for...of по-прежнему не поддерживается в Internet Explorer. Ссылка
  • forEach также широко поддерживается для массивов. Ссылка