Итерация массивоподобных объектов с использованием forEach, [].forEach.call(...) или Array.prototype.slice.call(...).forEach?

Мы можем выполнить итерацию по массивоподобным объектам, используя оба следующих метода:

let arrayLike = document.getElementsByClassName('dummy');

[].forEach.call(arrayLike, (e) => {
  console.info(e);
});
<div class = "dummy">Test1</div>
<div class = "dummy">Test2</div>

Или используйте slice, чтобы сначала преобразовать массивоподобные объекты в массив:

let arrayLike = document.getElementsByClassName('dummy');

Array.prototype.slice.call(arrayLike).forEach((e) => {
  console.info(e);
});
<div class = "dummy">Test1</div>
<div class = "dummy">Test2</div>

Какой из них предпочтительнее и почему в случае, когда мне не нужен преобразованный массивоподобный объект? Первый кажется немного «хакерским», но второй кажется более читабельным. Или оба одинаковы, то есть оба будут работать нормально?

[...arrayLike].forEach() или Array.from(arrayLike)
adiga 08.04.2019 10:52

Другой вариант — for...of.

hindmost 08.04.2019 10:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
2
162
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете взять Array.from и преобразовать массив как объект в реальный массив. Затем выполните итерацию с некоторыми методами массива.

let array = Array.from(document.getElementsByClassName('dummy'));

array.forEach((e) => {
    console.info(e);
});
<div class = "dummy">Test1</div>
<div class = "dummy">Test2</div>

Это поддерживается только в ES6 (2015), что, на мой взгляд, является чем-то новым? Я думал, что это намного чище, но беспокоюсь о его поддержке.

Richard 08.04.2019 10:53

Если вы не планируете поддерживать <=IE11, похоже, что вы защищены без полифилла: связь

maazadeeb 08.04.2019 11:00

вы берете стрелочные функции, и let. они поддерживаются более или менее в любом браузере, кроме IE.

Nina Scholz 08.04.2019 11:00

Я не планирую поддерживать ниже IE11, если вообще xD Спасибо за ответ.

Richard 08.04.2019 11:03

О, только что узнал, что вещи, которые я использовал являются из ES6. Я зря волновался.

Richard 08.04.2019 11:07

Вы также можете использовать синтаксис распространения

[...document.getElementsByClassName('dummy')].forEach((e) => {
  e.classList.add('test')
});
.test {
  color: green;
}
<div class = "dummy">Test1</div>
<div class = "dummy">Test2</div>

Используйте Array.from, slice или ... (расширение):

var divs = [...document.getElementsByClassName('dummy')]
divs.forEach(d => console.info(d));
var divs2 = Array.from(document.getElementsByClassName('dummy'));
divs2.forEach(d => console.info(d));
var divs3 = Array.from(document.getElementsByClassName('dummy'));
divs3.forEach(d => console.info(d));
<div class = "dummy">Test1</div>
<div class = "dummy">Test2</div>

Другие вопросы по теме