Я читаю о методе querySelector
, статья предполагает, что один из них должен использовать Array.prototype.map.call()
вместо map()
. У меня нет проблем с этим, однако я действительно не понимаю, почему Array.prototype.map.call()
следует выбирать над Array.map()
Что делает его лучше другого?
let nodes = document.querySelectorAll('div.menu-item')
Array.prototype.map.call(nodes, one => one.innerHTML)
//vs
Array.map(nodes, one => one.innerHTML)
Что делает его лучше другого?
В стандартной библиотеке JavaScript нет Array.map
. Поэтому, если вы используете его, вы полагаетесь на неуказанную функцию, которая может присутствовать или не присутствовать во всех ваших целевых средах. (Firefox SpiderMonkey работает под управлением JavaScript, например, движок Chrome V8 на данный момент не работает.) Таким образом, это будет довольно существенная причина, чтобы предпочесть Array.prototype.map.call
- из этих двух вариантов. :-)
Но, как указывает ste2425, учитывая использование функций let
и arrow, вы, кажется, кодируете среду ES2015+. В этом случае (или если вы добавите полипол) вы можете использовать функции отображения Array.from
:
let innerHTMLArray = Array.from(nodes, one => one.innerHTML);
Array.from
создает массив из любого объекта, подобного массиву или итерируемого объекта. NodeList
от querySelectorAll
одновременно. :-) И это необязательно позволяет вам сопоставлять значения по мере их выполнения.
Пример:
if (!Array.from) {
console.error("Your browser doesn't support Array.from yet.");
} else {
const htmlArray = Array.from(document.querySelectorAll("div.menu-item"), e => e.innerHTML);
console.log(htmlArray);
}
<div>I'm not included in the result because I don't have the class</div>
<div class="menu-item">Menu item #1</div>
<div class="menu-item">Menu item #2</div>
<div class="menu-item">Menu item #3</div>
Array.map
не определен. Так добавлен ли Array.map()
в стандарт es2015?
Во-первых, нет Array.map
. Вариант использования для первого варианта следующий: вы не сможете ссылаться на map
например, с помощью document.querySelectorAll('div')[0].map
. Это связано с тем, что document.querySelectorAll
возвращает NodeList
а не массив и не имеет метода карты.
Что делает его лучше другого?
На самом деле вопрос не в том, какой вариант лучше. Речь идет о невозможности называть map
в NodeList.
Большинство функций в прототипе массива могут обрабатывать объекты, подобные массиву (то есть объекты, ключи которых представляют собой числовые индексы), когда они передаются как thisArg
для вызова (or apply). Hence,
(or apply). Hence,
Array.prototype.map.call(array-like, mapFunction) 'может отображать NodeList точно так же, как массив.
Однако есть две альтернативы:
Array.from(nodes, n => n.innerHTML)
введенные в ES6 и не поддерживаемые в Internet Explorer. Однако, когда это не имеет значения, я бы предпочел это.Array.prototype.slice.call(nodes).map(n => n.innerHTML)
, который работает аналогично (см., Как работает Array.prototype.slice.call()?) Или придерживаться Array.prototype.map.call
.Однако в соответствии с вашим общим кодом использование (1) кажется совершенно прекрасным, и я, лично, предпочел бы это.
Array.from
, немедленное использование map
для результата бессмысленно и неэффективно. Просто используйте аргумент обратного вызова для Array.from
.
Array.from(document.querySelectorAll('div.menu-item')).map(one => one.innerHTML)
было бы лучше видеть в ES2015 (называть его ES6 - сложная привычка для выхода) ,Array.from
:Array.from(document.querySelectorAll('div.menu-item'), one => one.innerHTML)