Array.prototype.slice.call()方法詳解 (調用方法中的參數截取出來)
在很多時候經常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面講一下其原理:
1、基本講解
-
1.在JS裏Array是一個類 slice是此類裏的一個方法 ,那麽使用此方法應該Array.prototype.slice這麽去用
slice從字面上的意思很容易理解就是截取(當然你不是英肓的話) 這方法如何使用呢?arrayObj.slice(start, [end])
很顯然是截取數組的一部分。 -
2.我們再看call
call([thisObj[,arg1[arg2[[argN]]]]])
- 1
thisObj是一個對象的方法
arrg1~argN是參數
那麽Array.prototype.slice.call(arguments,1);
這句話的意思就是說把調用方法的參數截取出來。
如:
function test(a,b,c,d)
{
var arg = Array.prototype.slice.call(arguments,1);
alert(arg);
}
test("a","b","c","d"); //b,c,d
2、疑惑解答
先給個例子,這是jqFloat插件裏的代碼:
if (element.data(‘jDefined‘)) {
if (options && typeof options === ‘object‘) {
methods.update.apply(this, Array.prototype.slice.call(arguments, 1));
}
} else {
methods.init.apply(this, Array.prototype.slice.call(arguments, 1));
}
多次用到 Array.prototype.slice.call(arguments, 1),不就是等於 arguments.slice(1) 嗎?像前者那樣寫具體的好處是什麽?這個很多js新手最疑惑的地方。那為什麽呢?
因為arguments並不是真正的數組對象,只是與數組類似而已,所以它並沒有slice這個方法,而Array.prototype.slice.call(arguments, 1)
可以理解成是讓arguments轉換成一個數組對象,讓arguments具有slice()方法。要是直接寫arguments.slice(1)會報錯。
typeof arguments==="Object" //而不是 "Array"
3、真正原理
Array.prototype.slice.call(arguments)
能將具有length屬性的對象轉成數組,除了IE下的節點集合(因為ie下的dom對象是以com對象的形式實現的,js對象與com對象不能進行轉換)
如:
var a={length:2,0:‘first‘,1:‘second‘};//類數組,有length屬性,長度為2,第0個是first,第1個是second
console.log(Array.prototype.slice.call(a,0));// ["first", "second"],調用數組的slice(0);
var a={length:2,0:‘first‘,1:‘second‘};
console.log(Array.prototype.slice.call(a,1));//["second"],調用數組的slice(1);
var a={0:‘first‘,1:‘second‘};//去掉length屬性,返回一個空數組
console.log(Array.prototype.slice.call(a,0));//[]
function test(){
console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0)
console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1)
}
test("a","b","c");
補充:
將函數的實際參數轉換成數組的方法
方法一:var args = Array.prototype.slice.call(arguments);
方法二:var args = [].slice.call(arguments, 0);
方法三:
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
最後,附個轉成數組的通用函數
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;
}
}
Array.prototype.slice.call()方法詳解 (調用方法中的參數截取出來)