Мы можем выполнить итерацию по массивоподобным объектам, используя оба следующих метода:
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>
Какой из них предпочтительнее и почему в случае, когда мне не нужен преобразованный массивоподобный объект? Первый кажется немного «хакерским», но второй кажется более читабельным. Или оба одинаковы, то есть оба будут работать нормально?
Вы можете взять 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), что, на мой взгляд, является чем-то новым? Я думал, что это намного чище, но беспокоюсь о его поддержке.
Если вы не планируете поддерживать <=IE11, похоже, что вы защищены без полифилла: связь
вы берете стрелочные функции, и let.
они поддерживаются более или менее в любом браузере, кроме IE.
Я не планирую поддерживать ниже IE11, если вообще xD Спасибо за ответ.
О, только что узнал, что вещи, которые я использовал являются из ES6. Я зря волновался.
Вы также можете использовать синтаксис распространения
[...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>
[...arrayLike].forEach()
илиArray.from(arrayLike)