通常の使用法に加えて、スライスは配列のようなオブジェクトを真の配列に変換するためによく使用されます。
名詞の説明: 配列のようなオブジェクト – { 0: 'foo', などの長さ属性を持つオブジェクト。 length: 1 } 、または { length: 'bar' } です。最も一般的な配列のようなオブジェクトは、V8 エンジンの array.js のソース コード (スライスの内部実装) です。
関数lice(start, end) {
var len = ToUint32(this.length), result = [];
for(var i = start; i result.push( this[i]);
}
return result;
}
スライスが配列型である必要はないことがわかります。 length 属性が必要です。また、length 属性は数値型である必要はありません。数値に変換できない場合、ToUnit32(this.length) は 0 を返します。
標準ブラウザの場合、スライスの原理は明確に説明されています。その上。しかし、迷惑な IE は常に私たちに問題を引き起こします:
var スライス = Array.prototype.slice; // => IE: オブジェクトが必要です。
slice.childNodes); // IE: JScript オブジェクトが必要です。 .
上記のコードは IE でエラーを報告します。残念なことに、IE の Trident エンジンはオープン ソースではないため、推測することしかできません:
var len = ToUint32(this.length), result = [];
if(__typeof__ this !== ' JScript オブジェクト') throw 'JScript オブジェクトが期待されます';
if(this === null) throw 'オブジェクトが期待されます';
for(var i = start; i < end; i ) {
result.push(this[ i]);
}
return result;
}
この時点で、この悲惨な ie は正当化されます。
スライスに関しては、別のトピックがあります。Array.prototype.slice と [].slice を使用する必要がありますか? 理論的には、[] は配列を作成する必要があり、パフォーマンスは Array.prototype よりもわずかに悪くなります。しかし実際には、この 2 つはほぼ同じであり、ループ内で i を使用するか i を使用するかのように、純粋に個人的な習慣の問題です。
最後のトピックはパフォーマンスについてです。配列フィルタリングの場合、色相を犠牲にして記述する方法があります:
for(var i = start, j = 0; i
ret[j ] = arr[i]; 🎜>}
空間を時間に置き換えます。プッシュを削除すると、大規模な配列のパフォーマンスが明らかに向上します。
早朝にブログを書いていて、気分が良くないので、皆さんにトピックを残さなければなりません:
コードをコピー
コードは次のとおりです: var slide = Array.prototype.slice; alert(slice.call({0: 'foo', length: 'bar'})[0]); / / ?
alert(slice.call(NaN).length) // ? alert({0: 'foo', length: ' 100'})[0]); //