將函數的實際參數轉換成數組的方法,習慣用Array.prototype.slice.call(arguments)
阿新 • • 發佈:2017-05-25
原型對象 func eof for spa 什麽 pre str div 方法一:通過
方法二:通過調用
實際參數在函數中我們可以使用 arguments 對象獲得 (註:形參可通過 arguments.callee 獲得),雖然 arguments 對象與數組形似,但仍不是真正意義上的數組。
我們可以通過數組的 slice 方法將 arguments 對象轉換成真正的數組。
方法一:通過Array.prototype
屬性調用slice
方法
var args = Array.prototype.slice.call(arguments);
Array 本身是沒有 slice 方法,它的方法在 Array.prototype中,而我們在調用 slice 方法的時候,如果在 Array 本身沒有找到 slice 方法的話,會通過它的原型鏈往上查找。
方法二:通過調用[]
的slice方法
var args = [].slice.call(arguments);
方法三:通過遍歷arguments,返回數組
function toArray(){ var args = []; for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } return args; }
註:一般的函數的 arguments.length 都在 10 以內,方法二有優勢; 方法二的代碼量上也比第一種少,至少可以減小一點字節
實例:
function revse(){ try{ return Array.prototype.slice.call(arguments); } catch(e){ var newarr=[]; for(var i=arguments.length-1;i>=0;i--){ //newarr.push(arguments[i]); newarr[i] = arguments[i]; //這樣比push快? } returnnewarr; } } var s = revse(‘a‘,‘b‘,‘c‘); console.log(s); //["a", "b", "c"]
跟arguments問題相關題目
在某些場景下,需要將函數的 arguments 參數作為一個數組調用,但是 arguments 是一個奇異對象,所以試著將 arguments 轉化為一個數組,例如下面例子:
function argToArr(){ return [].slice.call(arguments, 0); } console.log(argToArr(1,2,3)); //[1,2,3] function argToArr(){ return Array.slice.call(arguments, 0); } console.log(argToArr(1,2,3)); //Uncaught TypeError: Cannot read property ‘call‘ of undefined
這是為什麽呢?
第二段代碼報錯是因為Array是構造函數,不是對象,打開控制臺,輸入 typeof Array
,結果是 function
。slice()
方法在其原型對象中,而[]
就是Arra
y的原型對象,在控制臺中輸入 Array.prototype
,結果是[]
,所以第一段代碼可以順利執行。
第二段代碼如下修改就可以了:
function argToArr(){ return Array.prototype.slice.call(arguments, 0); // 改這一行 } console.log(argToArr(1,2,3));
將函數的實際參數轉換成數組的方法,習慣用Array.prototype.slice.call(arguments)