我对Dom 元素(更正式称为Nodelist)的集合无法像数组那样操纵的事实感到不满,因为它不是一个。但是它看起来确实像一个,认为这是JavaScript新手经常犯的一个错误,即对于我们即将推出的JavaScript参考,我认为有必要注意这一点,因为>每个> dom> dom 对象,或返回集合。
您可以通过像数组这样的收藏来迭代:
for(var i=0; i<collection.length; i++)
{
//whatever
}
登录后复制
但是您不能使用push(),splice()或rectress()之类的数组方法来操纵它。
除非您可以,如果您采取下一步并将其转换为数组。实际上,这是微不足道的:
function collectionToArray(collection)
{
var ary = [];
for(var i=0, len = collection.length; i < len; i++)
{
ary.push(collection[i]);
}
return ary;
}
登录后复制
上面的代码是完全跨浏览器的,并以原始集合作为参数称为:
var elements = collectionToArray(document.getElementsByTagName('*'));
登录后复制
但是,如果您只需要处理支持本地对象原型制作的浏览器(Opera,Firefox和Safari 3),那么您可以简单地创建Nodelist的ToArray()方法:
NodeList.prototype.toArray = function()
{
var ary = [];
for(var i=0, len = this.length; i < len; i++)
{
ary.push(this[i]);
}
return ary;
};
登录后复制
然后可以将其称为单个集合的一种方法:
var elements = document.getElementsByTagName('*').toArray();
登录后复制
这种转换有一个明显的劣势(但是完成了),那就是由此产生的阵列将不再是节日式的。显而易见,是的,但有意义,因为它具有两个含义:
- >它将失去其从Nodelist继承的属性和方法。但是,Nodelist只有一个属性(它的长度,也可用于数组),而一种方法(通常是冗余的item()方法,因为成员仍然可以使用Square-bracket符号来引用成员)。因此,这种损失根本不是重大的
- >它将不再是现场收藏。 Nodelist是对象集合的参考,如果该集合更改(例如,添加或删除元素),节点符将自动更新以反映该更改; 相反,我们的数组是一个时间点的静态快照,因此不会根据DOM 的更改进行更新。根据您的申请,这可能很重要。
>有关JavaScript收集和数组的经常询问的问题
> javascript中的集合和数组之间有什么区别?这些元素可以是任何类型的元素,包括其他集合。当您需要与一组类似项目一起工作时,通常会使用集合,但是它们没有与数组相同的方法和属性。另一方面,数组是代表项目列表的特殊对象类型。阵列具有操纵和查询其内容的内置方法,例如推送,弹出,移位,解开等等。最常见的方法之一是使用array.from()函数。此函数从迭代的对象创建一个新的数组实例。以下是一个示例:
让收集= document.getElementsbytagname('div');
让array = array.from(collection);
在本示例中,在本示例中,div元素的集合被转换为数组。不是数组。但是,您可以使用array.from()或差异操作员将集合转换为数组,然后在结果数组上使用数组方法。>
在JavaScript中使用集合而不是javascript?
集合的优点是什么优点。它们提供了指向DOM的实时链接,这意味着如果DOM更改,则将自动更新集合。这是数组无法做的事情。但是,阵列具有更多的内置方法来操纵数据,因此对于数据操纵任务而言,它们通常更方便。>什么是JavaScript中的数组样对象?>一个数组样对象是一个具有长度属性并且可以像数组一样将元素存储在特定索引上的对象。但是,它没有诸如push,pop等的数组方法。类似阵列的对象的常见示例是所有函数中可用的参数对象。
如何识别我如何在javascript中是一个数组还是javaScript?
中的集合?如果对象是数组,则此方法将返回true,否则为false。没有内置的方法可以检查对象是否是集合,但是您可以检查它是否具有集合的某些属性,例如长度或物品。
>我可以使用传播操作员将藏品转换为数组吗?
是的,您可以使用传播器(……)将收藏夹转换为阵列。传播操作员通过将收集元素扩展到一个新数组来工作。以下是一个示例:
让收集= document.getElementsbytagname('div');
让array = [... collection];
> javaScript中的静态和实时收藏之间的区别是什么?这意味着,如果从DOM添加或删除元素,则将自动更新集合以反映这些更改。另一方面,当DOM更改时,静态集合不会更新。一旦创建它,无论对DOM的更改如何,它都保持不变。收集是只读的。但是,您可以修改该集合所基于的DOM元素,如果该集合是实时集合,则可以更新集合。>
我可以在JavaScript中的集合上使用foreach吗?
不,不,您不能直接在集合上使用foreach,因为集合不是数组。但是,您可以使用array.from()或差异操作员将集合转换为数组,然后在结果数组上使用foreach。
以上是收藏不是数组的详细内容。更多信息请关注PHP中文网其他相关文章!