函数内的arguments 对象,有人称之为“类数组”对象,因为它具有数组的一些特性:拥有length 属性、并且用数字索引存放着参数以便访问,可大家都知道其实它并不是数组。

有的时候需要将参数列表看作一数组,以便使用数组的一些方法(如concat, splice 等)进行操作,这就要想办法做一个转换,《JavaScript 语言精粹》一书中有类似这么一段操作:

(function() {
var slice = Array.prototype.slice,
aArguments
= slice.apply(arguments);
})(
10, 20, 30);

简单一点也可写作:

(function() {
var aArguments = [].slice.apply(arguments);
})(
10, 20, 30);

此时aArguments 已经是参数数组[10, 20, 30] 了。

slice 方法确实可用于拷贝数组,但它是属于数组的方法,直接arguments.slice() 肯定是不行的。上面的方法则比较巧妙,它利用了arguments 对象的那些数组特性,然后通过apply 使自身运用于数组的slice 方法,以达到转换为数组类型的效果。

由此可知像slice 这样的数组方法也可运用于非数组对象,于是本人猜想,数组的slice 方法的实现可能是类似于这样的:

Array.prototype.slice = function(start, end) {
var ret = [],
_i
= start || 0,
_l
= end || this.length;
for ( ; _i < _l; _i++) {
ret.push(
this[_i]);
}
return ret;
};

作者: Eric6 发表于 2011-03-07 12:09 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架