Aray.prototype.slice.cal(argments)


Aray.prototype.slice.cal(argments)
この文章を転載する時、一部にはまだ困惑しています.そして、作者が大胆に推測している部分は信頼できないと感じています.この文章はコール方法の原理をよく説明します.
我々は、Aray.prototype.slice.calはlength属性を持つオブジェクトを配列に変換することができ、IEの下のノードセットを除いて(ieの下のdomオブジェクトはcomオブジェクトとして実現されるので、jsオブジェクトとcomオブジェクトは変換できない).
例えば:
1 var a={length:2,0:'first',1:'second'};
2 Array.prototype.slice.call(a);//  ["first", "second"]
3  
4 var a={length:2};
5 Array.prototype.slice.call(a);//  [undefined, undefined]
jsの子供用の靴を習い始めたばかりかもしれませんが、なぜこのような機能が実現されたのかはよく分かりません.例えば私は一つです.だから、探してみます.
まず、sliceには二つの使い方があります.一つはString.sliceで、一つはAray.sliceで、一つは文字列で、二つ目は行列で、ここで2番目を見ます.
Aray.prototype.slice.calはargmentsを行列に変換できます.それはargments.toAray().slice()です.ここでは、アーラy.prototype.slice.calのプロセスは、まず入ってきた最初のパラメータを配列に変えてから、sliceを呼び出してもいいですか?
 
コールの使い方を見たら、次のような例があります.
1 var a = function(){
2      console.log(this);    // 'littledu'
3      console.log(typeof this);      //  Object
4      console.log(this instanceof String);    // true
5 }
6 a.call('littledu');
コールした後、伝達パラメータの作用領域に現在の関数を入れたということが分かります.これは正しいかどうか分かりませんが、とにかくthisは伝わった対象を指しています.
ここでは、基本的にはほぼ同じです.私達は大胆にsliceの内部実現を当ててみます.
1 Array.prototype.slice = function(start,end){
2      var result = new Array();
3      start = start || 0;
4      end = end || this.length; //this       ,   call ,    this   ,           ,    
5      for(var i = start; i < end; i++){
6           result.push(this[i]);
7      }
8      return result;
9 }
たぶんこのようにしましょう.理解すればいいです.深く追究しません.
 
最後に、行列に変換する汎用関数を付けます.
 1 var toArray = function(s){
 2     try{
 3         return Array.prototype.slice.call(s);
 4     } catch(e){
 5             var arr = [];
 6             for(var i = 0,len = s.length; i < len; i++){
 7                 //arr.push(s[i]);
                   arr[i] = s[i];  //     push 
 8             }
 9              return arr;
10     }
11 }