JS進階篇--函數實際參數轉換成數組的方法[].slice.call(arguments)

實際參數在函數中咱們可使用 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);

方法三:經過遍歷arguments,返回數組

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()方法在其原型對象中,而[]就是Array的原型對象,在控制檯中輸入 Array.prototype,結果是[],因此第一段代碼能夠順利執行。原型

第二段代碼以下修改就能夠了:io

function argToArr(){
    return Array.prototype.slice.call(arguments, 0); // 改這一行
}
console.log(argToArr(1,2,3));
相關文章
相關標籤/搜索