Javascript document.querySelectorAll的返回类型是什么
假设我有以下列表:Javascript document.querySelectorAll的返回类型是什么,javascript,html,Javascript,Html,假设我有以下列表: <ol> <li>Cookies <ol> <li>Coffee</li> <li>Milk</li> <li class="test1">Chocolate </li> </ol> 当我尝试在Chrome节点.forEach时,它给了我一个错误。当我查看该值时,它看起来像一个数组。事实上,我可以使用一个常规的 f
<ol>
<li>Cookies <ol>
<li>Coffee</li>
<li>Milk</li>
<li class="test1">Chocolate </li>
</ol>
当我尝试在Chrome节点.forEach
时,它给了我一个错误。当我查看该值时,它看起来像一个数组。事实上,我可以使用一个常规的
for(var i=0;i<nodes.length;i++){
nodes[i].onclick= function(){ alert('Hello!'); };
}
for(var i=0;i在中,它表示:
[返回的元素列表]是元素对象的非活动节点列表
与数组(完全不同的原型链)不同,文档还告诉您为什么不能使用forEach
:
为什么我不能在节点列表上使用forEach
或map
?
NodeList
的使用非常类似于数组,使用Array.prototype
方法很有诱惑力,但是它们没有这些方法
JavaScript具有基于内置对象(如Array
s)和主机对象(如NodeList
s)原型的继承机制。Array
实例继承数组方法(如forEach
或map
),因为它们的原型链如下所示:
myArray-->Array.prototype-->Object.prototype-->null
(可以通过多次调用Object.getPrototypeOf来获取对象的原型链。)
forEach
、map
等都是数组.prototype
对象本身的属性
与阵列不同,节点列表
原型链如下所示:
myNodeList-->NodeList.prototype-->Object.prototype-->null
NodeList.prototype
包含item方法,但没有Array.prototype
方法,因此它们不能用于NodeLists
但是,还有一些解决方法。同样从文档中可以直接使用Array.prototype.forEach
和Array.prototype.map
方法,如下所示:
var forEach = Array.prototype.forEach;
var divs = document.getElementsByTagName( 'div' );
var firstDiv = divs[ 0 ];
forEach.call(firstDiv.childNodes, function( divChild ){
divChild.parentNode.style.color = '#0F0';
});
更新:
在这种情况下,NodeLists
现在可以像数组*一样访问
:
访问匹配项
返回匹配元素的NodeList后,可以像检查任何数组一样检查它。如果数组为空(即,其length属性为0),则找不到匹配项
否则,您可以简单地使用标准数组表示法访问列表的内容。您可以使用任何通用循环语句,例如:
*虽然您现在可以使用forEach
,但像map
这样的其他方法不可用。
结果的类型是节点列表。
由于它是一个类似数组的对象,因此可以在其上运行map
、forEach
和其他Array.prototype函数,如下所示:
var result = document.querySelectorAll('a');
Array.prototype.map.call(result, function(t){ return t; })
数组原型中的映射
、forEach
、任何
和其他函数都适用于类似数组的对象。例如,让我们使用数字索引(0,1)和长度属性定义一个对象文字:
var arrayLike = { '0': 'a', '1': 'b', length: 2};
应用于arrayLike
对象的forEach方法与实际数组类似
Array.prototype.forEach.call(arrayLike, function(x){ console.log(x) } ); //prints a and b
类型是NodeList
。我不知道你说的“任何东西”是什么意思用逗号分隔;也许它看起来像控制台上的那样,但这只是节点列表的字符串表示形式;相似之处很肤浅。我的意思是@Giovanni刚刚发布的内容,我可以使用Array.prototype.forEach.call。这给我的印象是“节点”返回的是数组类型,不是吗?不。您可以将其与数组一起使用。prototype.forEach
并不意味着节点列表是数组。您可以从prototype链中看到这一点。它只意味着节点列表
符合forEach
需要遍历每个元素的任何接口这篇文章很有帮助:使用调用
和应用
,可以将执行上下文作为第一个参数传递。我很乐意提供帮助:-)谢谢@GiovanniFilardo。我现在想知道的是,为什么我可以通过Array.prototype.[method].call来实现它,而对象本身不是一个“数组”看起来像一个数组,可以绕过它使它像一个数组一样工作,但它不是一个数组?@Dalorzo我编辑了答案,扩展了call
和apply
参数,因为注释中的代码不可读。
var arrayLike = { '0': 'a', '1': 'b', length: 2};
Array.prototype.forEach.call(arrayLike, function(x){ console.log(x) } ); //prints a and b