arguments类数组对象详解

arguments类数组对象详解

arguments对象保存着函数被调用时的参数列表,它是一个类数组对象,有一个length属性但没有任何数组的方法。

  它不能像数组一样,进行排序操作或者往集合里添加一个新的元素。

所以我们经常非常频繁的找Array.prototype对象借用方法。

  像Array.prototype.slice可以把arguments转成真正的数组;想截去arguments列表中头一个元素时,又可以借用Array.prototype.shift方法。

  要了解这种机制的实现原理,需要查看一下V8引擎的源码,比如Array.prototype.push:

1
2
3
4
5
6
7
8
9
function ArrayPush(){
var n=TO_UINT32(this.length); //被push的对象的length
var m=%_ArgumentsLength(); //push的参数个数
for(var i=0;i<m;i++){
this[i+n]=%_Arguments(i); //复制元素
}
this.length=n+m; //修正length属性的值
return this.length;
}

 可见Array.prototype.push实际上是一个属性复制的过程,把参数按照下标依次添加到被push的对象上面,顺便修改了这个对象的属性。所以只要是个对象,不管是数组对象还是类数组对象,都可以操作。

文章目录
  1. 1. arguments类数组对象详解
    1. 1.0.1. arguments对象保存着函数被调用时的参数列表,它是一个类数组对象,有一个length属性但没有任何数组的方法。
    2. 1.0.2. 所以我们经常非常频繁的找Array.prototype对象借用方法。
,