實際參數在函數中咱們可使用 arguments 對象得到 (注:形參可經過 arguments.callee 得到),雖然 arguments 對象與數組形似,但仍不是真正意義上的數組。數組
咱們能夠經過數組的 slice 方法將 arguments 對象轉換成真正的數組。函數
Array.prototype
屬性調用slice
方法var args = Array.prototype.slice.call(arguments);
Array 自己是沒有 slice 方法,它的方法在 Array.prototype中,而咱們在調用 slice 方法的時候,若是在 Array 自己沒有找到 slice 方法的話,會經過它的原型鏈往上查找。prototype
[]
的slice方法var args = [].slice.call(arguments, 0);
function toArray(){ var args = []; for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } return args; }
注:通常的函數的 arguments.length 都在 10 之內,方法二有優點;
方法二的代碼量上也比第一種少,至少能夠減少一點字節code
實例:對象
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快? } return newarr; } } 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
,結果是[]
,因此第一段代碼能夠順利執行。原型
第二段代碼以下修改就能夠了:io
function argToArr(){ return Array.prototype.slice.call(arguments, 0); // 改這一行 } console.log(argToArr(1,2,3));