将JavaScript 函数内的arguments 对象转换为数组
函数内的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;
};
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架