2012-01-25 7 views
16

I'vは、ネイティブオブジェクトへの配列のプロトタイプを適用する両方の方法に遭遇します対象:[] .slice又はArray.prototype.slice

type = Object.prototype.toString.call(obj); 
type = {}.toString.call(obj); 

簡単なテスト:

function fn() { 
    console.log(
     Array.prototype.slice.call(arguments), 
     [].slice.call(arguments), 
     Object.prototype.toString.call(arguments), 
     {}.toString.call(arguments) 
    ); 
} 

fn(0,1); 

フィドル:http://jsfiddle.net/PhdmN/

彼らは私と同じようです。最初の構文はより頻繁に使用されますが、2番目の構文は確実に短くなります。より短い構文を使用すると、何らかの欠点がありますか?

+4

第2の構文は、不必要に新しいオブジェクトを作成します。 –

+1

@DanD。正解であるため、これを回答として投稿する必要があります。 ;) – Lucero

答えて

25

機能に関しては同じです。

ただし、Arrayオブジェクトを上書きすると、最初のメソッドが失敗する可能性があります。

//Example: 
Array = {}; 
console.log(typeof Array.prototype.slice); // "undefined" 
console.log(typeof [].slice); // "function" 

リテラル方法は、(Array.prototype.方法とは対照的)Arrayの新しいインスタンスを作成します。あなたが心配ならば -

  • var slice = Array.prototype.slice; //Commonly used
  • var slice = [].slice;:両方の方法のベンチマークは:http://jsperf.com/bbarr-new-array-vs-literal/3あなたがメソッドを何度も使用するつもり

    、ベストプラクティスは、メソッドをキャッシュすることですArrayの存在、または短い構文が好きな人。

+1

いいえ、結果は同じです。何もない新しいオブジェクトを作成することは同じではなく、プロトタイプを明示的に使用することは、ランタイムがメソッドが存在する場所を特定する作業が少なくてすむため、高速です。両方とも限界がありますが、同じように使用するのが簡単であれば、より良い解決策にはいかがですか? – Lucero

+0

@Lucero彼らは機能性に関しては全く同じです。 '[] .slice'は新しいインスタンスを初期化します(パフォーマンスにはほとんど影響しません)。 'Array'メソッドはより洗練されていますが、' Array'が再定義されたときに失敗するので、JS1の –

+3

は多くのことを壊すことがあります。 'Array.prototype.slice'が変更された場合、両方のバリアントは期待どおりに動作しません。再定義された 'undefined'を思い出させます...とにかく、何もないオブジェクトを作成するのは高価ではありませんが、ガベージコレクションのコストを考慮すると、タイトなループで追加される可能性があります。 – Lucero

関連する問題