伪数组
什么是伪数组?
拥有length属性,无法直接调用数组方法,但可以通过下标对每个元素进行访问的数据集合就是伪数组。
有哪些常见的伪数组?
1.arguments
2.NodeList
下面我们来详细的介绍这两种伪数组:
arguments
arguments:类数组对象,js中每一个函数都会有一个Arguments的实例对象(arguments)。
特点:
1.arguments会将实参的值以数组的形式保存,以及传入的实参个数(length)
2.arguments的callee属性指向函数自己,(可以使用arguments.callee实现递归),如果想让一个匿名函数进行递归就可以使用arguments.callee;
3.arguments和函数中的形参是一一映射的(如第一个形参和arguments[0]的值是相等的,并且当形参改变时arguments[0]的值也会改变),
映射规则:
(1)当实参与形参的数量相等时,形参与arguments为映射关系(形参变量值改变时,相对的arguments[i]的值也改变,反过来也是一样的)
(2)当实参的数量少于形参量时,多出的形参与arguments不存在映射关系
(3)arguments和形参的映射机制是建里在函数执行后形参赋值的一瞬间,所以无法手动绑定。
*(在js严格模式下[在当前作用域的第一行添加“use strict”]下arguments不会产生映射,同时arguments.callee也不能使用);
NodeList
在一般情况下,nodelist是一个时实时集合(动态的),也就是说如果dom树发生改变,那么nodelist也会随之变化
例子:
<ul id="ul">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<script>
var liAll = document.getElementsByTagName('li');
console.log(liAll);
// 删除掉其中一个
document.getElementsByTagName('li')[2].remove();
console.log(liAll);
结果
但是,如果你使用的document.querySelectorAll()获取dom就会返回一个静态的nodelist;
伪数组转真数组
1.简单的for循环,把类数组的每一项都遍历真数组中
2.使用call方法让伪数组能使用selice方法:
var arr=Array.prototype.sclice.call(伪数组);
3.es6中的Array.from
var arr=Array.from(伪数组);
4.展开运算符
var arr=[…伪数组];
5.和第二种方法是一样的,换了一种写法
var arr=[].sclice.call(伪数组);
(如果这篇文章有什么问题请及时联系我!)