關於[].slice.call(arguments, 1)自己的思考
阿新 • • 發佈:2018-12-13
[].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]