javascript - `document.getElementsByClassName` 的结果没有定义像 `map` 这样的数组方法,即使它是一个数组

标签 javascript arrays map

我有以下代码来选择一些 div 并在其上添加点击处理程序

var tiles = document.getElementsByClassName("tile");

tiles.map(function(tile, i){
    tile.addEventListener("click", function(e){
        console.log("click!");
    });
});

这会引发错误,因为 map 未定义,即使 tiles 是一个数组。 如果我制作这样的数组,则 map 可以正常工作:

var a = [1, 2, 3, 4];
a.map(/*whatever*/);

解决方法是像这样将 map 附加到图 block :

tiles.map = Array.prototype.map;

这很好用。 我的问题是为什么 tiles 没有定义 map ?真的不是数组吗?

最佳答案

对,它不是真正的数组。这是一个“类数组”。

不要将 map 附加到 tiles。就这样

Array.prototype.map.call(tiles, function...)

有些人可能会建议

Array.prototype.slice.call(tiles).map(function...

归结为同一件事。有些人喜欢写

[].slice.call(tiles).map(function...

这节省了几次击键。

当然,因为您并没有真正使用 map 来返回数组,所以您可以用老式的方式循环:

for (var i = 0; i < tiles.length; i++) {
    tiles[i].addEventListener("click", function(e){
        console.log("click!");
    });
}

另见 explanation at MDN .虽然这里讨论的是 NodeList,但同样的原则也适用于 HTMLCollection,这是 getElementsByClassName 返回的内容。

在 ES6 中,我们有一些更简单的方法可以将 tiles 变成数组,包括

[...tiles]
Array.from(tiles)

关于javascript - `document.getElementsByClassName` 的结果没有定义像 `map` 这样的数组方法,即使它是一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26409397/

相关文章:

javascript - 生成一个4位数组,其中包含不重复的数字

c - 将字符加载到动态分配的二维数组中

ios - MKRouteStep:位置在哪里?

javascript - 如何以 JSON 形式发送 Google 云平台的 Windows key ?

javascript - 通过 jquery ajax 发布和获取值

java - 你能有一组不同种类的对象吗?

scala - 将列表转换为 map 并在一行中获取项目

java - 具有有限元素的 FIFO 映射

javascript - NodeJS 和 ExpressJS Router.use() 错误

javascript - JS 关联数组上的 toString()