Array.prototype.slice.call(arguments) )

來源:互聯網
上載者:User
我們知道,Array.prototype.slice.call(arguments)能將具有length屬性的對象轉成數組,除了IE下的節點集合(因為ie下的dom對象是以com對象的形式實現的,js對象與com對象不能進行轉換)如:var a={length:2,0:'first',1:'second'};
Array.prototype.slice.call(a);//  ["first", "second"]
 
var a={length:2};
Array.prototype.slice.call(a);//  [undefined, undefined]

可能剛開始學習js的童鞋並不是很能理解這句為什麼能實現這樣的功能。比如我就是一個,所以,來探究一下。

首先,slice有兩個用法,一個是String.slice,一個是Array.slice,第一個返回的是字串,第二個返回的是數組,這裡我們看第2個。

Array.prototype.slice.call(arguments)能夠將arguments轉成數組,那麼就是arguments.toArray().slice();到這裡,是不是就可以說Array.prototype.slice.call(arguments)的過程就是先將傳入進來的第一個參數轉為數組,再調用slice?再看call的用法,如下例子var a = function(){
      console.log(this);    // 'littledu'
      console.log(typeof this);      //  Object
      console.log(this instanceof String);    // true
 }
 a.call('littledu');可以看出,call了後,就把當前函數推入所傳參數的範圍中去了,不知道這樣說對不對,但反正this就指向了所傳進去的對象就肯定的了。到這裡,基本就差不多了,我們可以大膽猜一下slice的內部實現,如下Array.prototype.slice = function(start,end){
      var result = new Array();
      start = start || 0;
      end = end || this.length; //this指向調用的對象,當用了call後,能夠改變this的指向,也就是指向傳進來的對象,這是關鍵
      for(var i = start; i < end; i++){
           result.push(this[i]);
      }
      return result;
 }

大概就是這樣吧,理解就行,不深究。

最後,附個轉成數組的通用函數

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;
     }
 }

 轉自:http://www.cnblogs.com/littledu/archive/2012/05/19/2508672.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.