原文:http://handyxuefeng.blog.163.com/blog/static/45452172201162192755468/
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;};