Эта статья: Перемещение DOM с помощью функций filter (), map () и стрелок защищает такое использование Array.map
, которое кажется мне странным. Более конкретно, автор статьи утверждает, что следующий фрагмент кода действителен и фактически лучше альтернативного Array.from(elements).map(...)
:
var elements = document.getElementsByClassName("bgflag");
BgFlags = Array.prototype.map.call(elements,
element =>
({
height: element.offsetTop,
bgsrc: element.dataset.bgsrc,
bgcolor: element.dataset.bgcolor,
size: element.dataset.size,
name: element.id,
image: parseInt(element.dataset.image)
})
);
Это кажется наиболее подозрительным для моего неподготовленный глаз. Мы вызываем Array.prototype.map
на то, что не является Array
. Если только где-то прямо не указано, что это разрешено, это пахнет как неопределенное поведение для меня. Я быстро просмотрел соответствующую документацию MDN, но не смог найти, что такое использование разрешено там.
И все же автор статьи подчеркивает:
Even хотя map () является функцией Array.prototype, он работает с любым итерабельным массивом.
Является ли такое использование допустимым, как он утверждает? Если это так, это также относится к другим функциям Array.prototype.*
, таким как filter
, slice
, возможно даже pop
, push
, другие?
Это то, что указано в спецификации:
В большинстве методов на
Array.prototype
есть эта заметка. Поэтому те, которые не могут быть использованы таким образом, не имеют этой заметки.Поэтому, если вы хотите использовать его, это, в сущности, вопрос стиля. Различные люди придут по-разному, будь то хороший / плохой / безразличный стиль.
Сторона Примечание: если вы собираетесь использовать
map
таким образом, а не писать это longhand каждый раз, дайте себе ярлык:, а затем используйте его следующим образом:
Пример Live:
Да, как правило, работает. Однако я согласен с тем, что:
намного чище.