8

各行の最後にコンソール出力がある次のコードについて考えてみましょう。

function whatever() {
  console.log(arguments) // { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
  console.log(Array.prototype.slice.call(arguments)) // [ 1, 2, 3, 4, 5 ]
  console.log(Array.prototype.slice.call({ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 })) // []
}

whatever(1,2,3,4,5)

console.log3番目が空の配列を出力するのはなぜですか?

4

3 に答える 3

13

が機能するためにはArray.prototype.slice、配列のようなオブジェクトを渡す必要があるためです。オブジェクトがそのカテゴリに適合するためには、オブジェクトにlengthはないプロパティが必要です。これを試して:

var arr = { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 };
arr.length = 5;
var res = Array.prototype.slice.call(arr);
console.log(res);

フィドル

于 2013-07-10T06:54:11.967 に答える
2

@basilikum が説明したように、これは.lengthを使用するために必要なためです.slice()なぜそれが必要なのかを理解するためにArray.prototype.slice()、MDN ドキュメントを読んだ後に独自のバージョンの を書いていると想像してください:


構文

Array.slice(begin[, end])

パラメーター

begin

抽出を開始するゼロベースのインデックス。

負のインデックスとしてbegin、シーケンスの末尾からのオフセットを示します。slice(-2)シーケンスの最後から 2 番目の要素と最後の要素を抽出します。

end

抽出を終了するゼロベースのインデックス。sliceまでを抽出しますが、これを含みませんend

slice(1,4)2 番目の要素から 4 番目の要素 (インデックス 1、2、および 3 の要素) を抽出します。

負のインデックスとしてend、シーケンスの末尾からのオフセットを示します。slice(2,-1)シーケンスの最後から 2 番目の要素から 3 番目の要素を抽出します。

endを省略した場合slice、シーケンスの最後まで抽出します。


これらすべてのケースとリストされていないいくつかのケースを処理するには、コードを次のようにする必要があります (これにはバグがあるかもしれませんが、近いはずです)。

Array.prototype.myslice = function( begin, end ) {
    // Use array length or 0 if missing
    var length = this.length || 0;
    // Handle missing begin
    if( begin === undefined ) begin = 0;
    // Handle negative begin, offset from array length
    if( begin < 0 ) begin = length + begin;
    // But make sure that didn't put it less than 0
    if( begin < 0 ) begin = 0;
    // Handle missing end or end too long
    if( end === undefined  ||  end > length ) end = length;
    // Handle negative end (don't have to worry about < 0)
    if( end < 0 ) end = length + end;
    // Now copy the elements and return resulting array
    var result = [];
    for( var i = begin;  i < end;  ++i )
        result.push( this[i] );
    return result;
};

そのため、.slice()requires this.length—これなしでは関数を書くことができません。

于 2013-07-10T08:57:55.410 に答える
0

知識がある限り

Argument は、メソッドに渡されるすべての引数のエントリを取得するために使用できるオブジェクト型の変数です

たとえば、これを使用する場合

whatever(a,b,c)

引数は次のようなものを返します0:a ,1:b ,2:c

slice メソッドは、配列を開始点から終了点までスライスするために使用されます

var myarray=["1","2","3","4"];
myarray.slice(2,3);

インデックス 2 と 3 に存在するため、3 と 4 を返します。

したがって、引数にスライスを使用したい場合は、次のように定義するだけですslice(startindex,endindex);

配列型を別の配列型データ構造に変換するために、編集 slice.call だけが使用されます。あなたの場合、引数を渡す間、それは javascript エンジンの既知の型であるため、配列型と見なされ、単純に変換されますが、配列はハードコーディングされます。うまくいかないようです(ただの考えです)。

于 2013-07-10T07:01:38.660 に答える