关于类数组对象
JavaScript中有一些著名的类数组对象,它们看起来很像数组:
拥有length属性
元素按序保存在对象中,可以通过索引访问
但实际和数组又不是一回事:
没有数组的很多方法
也会有数组没有的方法
(e.g. NodeList的item()方法)有些类数组对象是动态变化的
(e.g. NodeList的值是基于DOM结构动态执行查询的结果)……
将类数组对象转换为数组对象
Array.prototype.slice.call(arraylike, 0);
这是一个遍地开花的方法,这里主要是想简单理解一下实现原理。
Array的通用方法
Array对象的很多方法都是通用方法,意思是其它非数组对象也可以直接借来使用,因为它们在设计时没有要求使用方法的对象必须是数组。
Array.prototype.slice()就是这样一个方法,只要对象有length属性并可以通过索引访问,就可以使用该方法。
当仅传入一个参数,且传入参数为空或0时,从索引为0的元素开始复制,直到最后一个元素,结果被保存在一个数组中返回。
Function.call()方法
这个方法使得你可以在一个对象上借用另一个对象的方法。
第一个参数即为实际调用方法的对象,其后的参数为依次传入方法的参数。
将NodeList对象转换为数组对象的限制
不知道现在还是否需要考虑这一点?
IE8之前的版本将NodeList实现为COM对象而非DOM对象,COM对象不能直接调用js方法,因此需要采取其他方式转化。
/* JavaScript高级程序设计-第十章 P250 */
function convertToArray(nodes) {
var array = null;
try {
array = Array.prototype.slice.call(nodes, 0);
} catch(ex) {
array = new Array();
for(var i=0; i<nodes.length; i++) {
array.push(nodes[i]);
}
}
return array;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。