1. 程式人生 > >關於[].slice.call(arguments, 1)自己的思考

關於[].slice.call(arguments, 1)自己的思考

[].slice.call(arguments, 1) 可以看作是 Array.prototype.slice.call(arguments,1)
它是能夠將具有length屬性的物件轉成陣列,


首先我們要明確一點就是兩個東西,第一是slice方法;
.slice() 方法可從已有的陣列中返回選定的元素。

var arr = new Array(3)  
arr[0] = "George"  
arr[1] = "John"  
arr[2] = "Thomas"  
console.log(arr.slice(0))   // VM1450:5 ["George", "John"
, "Thomas"] console.log(arr.slice(0,2)) // VM1620:5 ["George", "John"] console.log(arr.slice(-1)) //VM1728:5 ["Thomas"]

可以看出slice() 方法是返回引數內給定的位置的新的陣列;


.call():呼叫一個物件的一個方法,以另一個物件替換當前物件。

function add(a,b)  
{  
    alert(a+b);  
}  
function sub(a,b)  
{  
    alert(a-b);  
}  

add.call(sub,3,1);
這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以執行結果為:alert(4); // 注意:js 中的函式其實是物件,函式名是對 Function 物件的引用。

arguments 物件:arguments物件是比較特別的一個物件,實際上是當前函式的一個內建屬性。arguments非常類似Array,但實際上又不是一個Array例項;它可以直接用來呼叫函式引數

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else
if(arguments.length == 2) { alert(arguments[0] + arguments[1]); } } doAdd(10); //輸出 "15" doAdd(40, 20); //輸出 "60"

最後我們來看
Array.prototype.slice.call(arguments,1)
arguments是一個關鍵字,代表當前引數,在javascript中雖然arguments表面上以陣列形式來表示,但實際上沒有原生陣列slice的功能,這裡使用call方法算是對arguments物件不完整陣列功能的修正,也就是說Array.prototype.slice.call(arguments)能夠將arguments轉成陣列

var toArray = function(s){
    try{
        return Array.prototype.slice.call(s);
    } catch(e){
            var arr = [];
            for(var i = 0,len = s.length; i < len; i++){
                //arr.push(s[i]);
                   arr[i] = s[i];  //據說這樣比push快
            }
             return arr;
    }
}

var a  =  new toArray(1,2,3)
console.log(a) // VM5723:14 [1, 2, 3]
var toArray = function(s){
    try{
        return Array.prototype.slice.call(arguments,1);
            // 將arguments當作陣列使用,並返回從1開始後的新的陣列
    } catch(e){
            var arr = [];
            for(var i = 0,len = s.length; i < len; i++){
                //arr.push(s[i]);
                   arr[i] = s[i];  //據說這樣比push快
            }
             return arr;
    }
}
var a  =  new toArray(1,2,3)
console.log(a) // VM6028:14 [2, 3]