Array.prototype.slice.call()方法詳解

Array.prototype.slice.call()方法詳解

翻看不少框架源碼,jquery和zepto等等都會有這句話
Array.prototype.slice.call
百思不得其解的咱們努力求證……javascript

基本原理java

  • slice:用來截取截取字符串方法
  • Array: javascript的一個引用類型,其原型prototype上有一個方法叫slice
  • call和apply : 用來改變對象中函數內部的this引用,使得函數能夠隨便換‘媽媽’
    第一個參數是context(就是上下文的意思),用來替換對象函數中的this
    第二個參數是傳遞給對象函數的參數

注意這句話對象函數中的thisjquery

function test(a,b,c,d) 
   { 
      var arg = Array.prototype.slice.call(arguments,1); 
      alert(arg); 
   } 
   test("a","b","c","d"); //b,c,d

疑惑 爲何不直接用 arguments.slice(1)呢 不是同樣的麼,哈哈數組

緣由 auguments是類數組,不是數組

Array.prototype.slice.call(arguments, 1)能夠理解成是讓arguments轉換成一個數組對象,讓arguments具備slice()方法。要是直接寫arguments.slice(1)會報錯。
app

 
image.png

 

 
image.png

 

  • arguments 是object 不是Array ,他的原型上沒有slice方法框架


     
    image.png

真正原理dom

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");

ps
將函數的實際參數轉換成數組的方法函數

  • 方法一:
    var args = Array.prototype.slice.call(arguments);
  • 方法二:
    var args = Array.prototype.slice.call(arguments);
  • 方法三:
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;
    }
}
相關文章
相關標籤/搜索