1. 程式人生 > >將函數的實際參數轉換成數組的方法,習慣用Array.prototype.slice.call(arguments)

將函數的實際參數轉換成數組的方法,習慣用Array.prototype.slice.call(arguments)

原型對象 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快?
        }
        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,結果是[],所以第一段代碼可以順利執行。

第二段代碼如下修改就可以了:

function argToArr(){
    return Array.prototype.slice.call(arguments, 0); // 改這一行
}
console.log(argToArr(1,2,3)); 

將函數的實際參數轉換成數組的方法,習慣用Array.prototype.slice.call(arguments)