javascriptのAray.prototype.slite.call

3985 ワード

前を書く
jsの中で私達はよくAray.prototype.slice.callの書き方を見ます.もちろん、この方法の作用はみんなが分かるかもしれません.それはクラスの配列オブジェクトを本物の配列に変換することです.この方法について自分の理解を話します.
ここではslice()方法とcall()方法について説明します.
sliceの方法
配列と文字列にはこのslice方法があります.この方法の役割はデータの一部を切り取ることです.二つのパラメータを受信します.一つ目のパラメータは切り取りの位置インデックスで、二つ目のパラメータは選択できます.切り取りの終了位置を表しますが、終了位置は含まれません.配列において、この方法の戻り値は、傍受された文字列からなる文字列を含む要素からなる配列である.
この方法は負の値にも入ることができ、パラメータが負の値の場合、パラメータと配列または文字列の長さを加算した正数を実際のパラメータとして使用します.
以下のとおりです

[1,2,3,4,5,6].slice(2,4);

[1,2,3,4,5,6].slice(-4,-2);

戻り値はすべて[3,4]で、行列です.

'everything'.slice(2,4);

'everything'.slice(-4,-2);

戻り値は、それぞれ「er」と「hi」となり、文字列となります.
一つのパラメータが入ってくると、スタート位置から終了位置までのすべての要素が出力されます.例をあげない
文字列の他の類似方法
文字列では、slice()方法の種類と、もう2つの方法があります.
substring()とsubstr()の方法.
ここで、substring()方法は、開始位置から終了位置に戻る文字列を表し、substr()は2つのパラメータを受信し、最初のパラメータは開始位置を表し、2番目のパラメータは切り取る文字の個数を表し、前の2つの方法とはやや異なる.
導入方法のパラメータが負の場合、この3つの方法はまた少し違っています.
着信方法のパラメータがマイナスの場合:
slice()というように、負の数に文字列の長さを加えて正の値を導出します.
substring()メソッドのパラメータはすべてゼロに設定されます.
substr()メソッドの最初のパラメータは負の値に文字列の長さを加えて得られた正の値であり、第二のパラメータはゼロである.
call()とappy()の方法
call()とappy()法は主に関数の作用領域を拡張するために用いられる.
call()とappy()の方法は、2つのパラメータを受信します.
apply():第一のパラメータは作用領域であり、第二のパラメータ配列であり、第二のパラメータは配列例であっても良いし、アーgmentsオブジェクトであっても良い.
call()メソッドも2つのパラメータを受信します.ただ、appy()とは異なります.伝達関数のパラメータは1つずつ書かなければなりません.
ここが重点ではないと考えて,ここではもはや詳しく述べない.

Array.prototype.slice.call(arguments,0)
Aray.prototype.slice.callでは、Aray.prototype.sliceが起動したのはArayのプロトタイプ方法で、本当に配列にはslice()方法がありますが、argmentsや自分で定義したようないくつかのクラスの配列オブジェクトにはlengthなどいくつかの属性がありますが、slice(方法)はありません.このような配列オブジェクトに対しては、プロトタイプの方法を用いてslice(Aray.prototype.slice)を使用する必要があります.
したがって、Aray.prototype.slice.call(argments,0)の意味は、argmentsクラスの配列に対して、Aray.prototype.sliceプロトタイプの方法を呼び出して、call()の方法でAray.prototypeをargmentsに限定して、ここでAray.prototypeはargmentsとして、最初のパラメータとして理解できます.この方法によりargmentsクラスの配列を真の配列に変換した.
もちろん、argmentsを配列に変換しても遍歴ができます.コードは自然に多くなります.直接ではないです.
我々は、Aray.prototype.slice.calは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で、一つはAray.sliceで、一つは文字列で、二つ目は行列で、ここで2番目を見ます.
Aray.prototype.slice.calはargmentsを行列に変換できます.それはargments.toAray().slice()です.ここでは、アーラy.prototype.slice.calのプロセスは、まず入ってきた最初のパラメータを配列に変えてから、sliceを呼び出してもいいですか?  コールの使い方を見たら、次のような例があります.

 var a = function(){
   console.log(this);  // 'littledu'
   console.log(typeof this);   // Object
   console.log(this instanceof String);  // true
 }
 a.call('littledu');
コールした後、伝達パラメータの作用領域に現在の関数を入れたということが分かります.これは正しいかどうか分かりませんが、とにかく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;
  }
}