Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript document.querySelectorAll的返回类型是什么_Javascript_Html - Fatal编程技术网

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