它看起来像是一个数组,并且它有一个length属性,然而它并非一个数组。JavaScript有时候是一门很怪异的语言,由于你很难定义一个数组的概念而没有什么例外的。
因此我说的这些类数组对象是什么?它们有一些,其中包括arguments
,arguments
是一个很特殊的变量,你再全部函数体内均可以访问到。javascript
假如你在一个工具(firebug)中检查arguments
这个变量,你会注意到它打印出来像是一个数组。它有按次序排列的元素,还有一个length属性。java
var testFunction = function() { console.log(arguments); console.log(arguments.length); };
因此我在抱怨什么?尝试arguments.shift()
,报错显示arguments.shift() isn't a function
,可是shift()是数组的一个函数。尝试console.log(arguments.constructor)
,它会打印Object()
,同时假如你输入的是[].constructor
,它会打印Array[]
。这是否是很奇怪?
这固然不只局限于arguments
,看起来不少DOM集合都会返回这种对象,例如document.getElementsByTagName()
, document.images
, document.childNodes
.在某些状况下,这些相似数组的更适合转变为一个数组。数组
固然这个标题是不太准确的,假如咱们须要将这些类数组对象变成数组同样,咱们须要创建一个新的数组。框架
var testFunction = function() { // Create a new array from the contents of arguments var args = Array.prototype.slice.call(arguments); var a = args.shift(); console.log("The first argument is: %s", a); // send the remaining arguments to some other function someOtherFunction(args); };
显然,关键的地方在Array.prototype.slice.call(arguments)
,拆开它仔细每一个部分。函数
Array
这是咱们想要的base object的名称工具
prototype
这能够被认为是一个数组实例方法的命名空间prototype
slice
提取一个数组的一部分,并返回一个新的数组,没有一个开始和结束索引,它只返回数组的副本.code
call
这是一个很是有用的函数,容许你在调用一个对象的函数,而后在另外一个函数的上下文中使用对象
另外一个方面,若是你曾经使用原型框架,你能够经过$A()
转化这些类数组对象成为数组。
谈到$A
,若是你不喜欢打上面那么长的字符串代码,而且你不使用Prototype。而后,你能够建立一条捷径,就像Prototype folks:索引
var $A = function(obj) { return Array.prototype.slice.call(obj); }; // Example usage: $A(document.getElementsByTagName("li"));