他の人のスクリプトで次のようなものをよく見かけます。
bar = Array.prototype.slice.call(whatever, 1)
ただし、次の短い表記法も問題なく機能します。
bar = [].slice.call(whatever, 1)
これら 2 つの構造は完全に同等ですか? それらを異なる方法で処理するエンジン (ブラウザー) はありますか?
他の人のスクリプトで次のようなものをよく見かけます。
bar = Array.prototype.slice.call(whatever, 1)
ただし、次の短い表記法も問題なく機能します。
bar = [].slice.call(whatever, 1)
これら 2 つの構造は完全に同等ですか? それらを異なる方法で処理するエンジン (ブラウザー) はありますか?
はい、完全に同等です。
.prototype
新しいオブジェクト インスタンスを作成する必要がないため、経由でのアクセスの方がわずかに高速です。ただし、それはマイクロ最適化と呼ばれるものです。
ディープ チェーンを完全に取り除く良い方法は、 を呼び出すことFunction.prototype.bind
です。
例
(function( slice ) {
slice( whatever, 1 );
}( Function.prototype.call.bind( Array.prototype.slice )));
厳密に言えば、それらは同等ではありません。この構造:
[].slice.call(whatever, 1)
ヒープからプロパティを取得するためだけに、配列の新しいインスタンスをヒープに割り当てます。したがって、副作用があります-ヒープにガベージを残します。