Js基础之类数组对象

概念

数组,是一种类列表对象,它的原型中提供了遍历和修改元素的相关操作,其类属性为”Array”。

类数组对象(array-like object),顾名思义,一个类似数组的对象。我们在Js中常见的类数组对象有:函数中的Arguments对象;DOM中的:NamedNodeMapHTMLCollectionNodeList对象。我们在此着重介绍Arguments( 一个对应于传递给函数的参数的类数组对象)。

类数组对象和数组的区别

  • 设置数组的length属性可扩展或截断数组,而对于类数组对象来说仅仅是改变了一个属性的值而已
  • 类数组不能调用数组方法

例:

// 类数组对象arguments
function b () {
   console.dir(arguments);
}
b(1,2,3);

// 数组
var a = [1,2,3];
console.dir(a);

我们可以看到,arguments和数组的结构上很相似,但是原型对象是不同的,所以这也就是为何类数组对象无法直接调用数组的方法——数组继承的是Array.prototype的方法,而类数组对象不是。

大家发现,Arguments中有一个callee属性,它引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内。具体可以参考MD里的说明。
还有一个比较陌生的属性Symbol(Symbol.iterator),它是ES6引入的原始数据类型,通过Symbol函数生成的值是独一无二的值,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。大家想详细了解可以参考阮一峰老师的ES6入门

在《Javascriptqu权威指南》这本书提到,我们可以通过如下方法来分辨类数组对象。

下边是DOM中常会接触到的三个类数组对象

1.NodeList
DOM节点访问以下属性或者调用以下方法会返回一个NodeList

Node.childNodes 
Node.getElementsByClassName(className)  
Node.getElementsByTagName(tagName)

2.NamedNodeMap
DOM元素通过访问attributes属性可返回一个NamedNodeMap。

3.HTMLCollection

以下代码都会返回一个HTMLCollection

document.images //所有img元素  
document.links //所有带href属性的a元素和area元素  
document.anchors //所有带name属性的a元素  
document.forms //所有form元素  
document.scripts //所有script元素  
tBodies(table元素)
rows(table、tbody、thead、tfoot元素)
cells(tr元素)

类数组对象转换为数组

使用apply、call、bind(ES5)

以下三种方式均可达到类数组对象转换为数组的目的

var newArr = [].slice.call(类数组对象);

var newArr = [].slice.apply(类数组对象);

var newArr = [].slice.bind(类数组对象);
newArr();

至于三个方法的区别和使用场景推荐大家看深入理解 call,apply 和 bind

使用Array.from()(ES6)

var newArr = Array.from(类数组对象);

使用方法参见阮一峰老师的ES6入门