web-dev-qa-db-ja.com

lodash _.size()はJS lengthプロパティよりも高速ですか?

記事(以下のリンク)では、文字列でlengthプロパティを使用すると、オブジェクト参照が作成され、関数が不必要に遅くなることが示唆されています。

http://www.webreference.com/programming/javascript/jkm3/2.html

このコンテキストで、lodash _.size()を使用する利点は何ですか? (ネイティブ...?)lengthプロパティと異なる動作をしますか?

オブジェクト内の配列またはキーをカウントしている場合、lengthプロパティの代わりにlodashサイズを使用する利点はありますか?

26
claireablani

Lodashソースから、_.size()は次のように実装されます。

_function size(collection) {
  var length = collection ? getLength(collection) : 0;
  return isLength(length) ? length : keys(collection).length;
}
_

配列の場合、最初の行は_collection.length_を間接的に実行しているため、_.size()は、もしあれば、少し(少し)少し遅くなります。

パフォーマンスの記事で、パフォーマンスの問題は、同じ目標を達成するためにスタック上の数値を使用できたときに、lengthのプロパティルックアップが使用されていることです。言い換えれば、解決策は、より高速なプロパティを探すことではなく、実行可能な場合にプロパティを完全に回避することでした。

28
DocMax

size() 関数は、結果のサイズが必要な場合にチェーンで最も役立ちます。サイズを取得するためだけに value() を使用してすべてをアンパックしても意味がありません。例えば:

__(_.range(10))
    .filter(function(item) { return item % 2; })
    .size();
_

長い形式とは対照的に:

__(_.range(10))
    .filter(function(item) { return item % 2; })
    .value()
    .length;
_

この関数は、オブジェクトのサイズを見つけやすくします:

__.size({ a: 1, b: 2 });
_

とは対照的に:

_Object.keys({ a: 1, b: 2 }).length;
_

size()はパフォーマンスではなくコードの簡潔さに関するものです。

24
Adam Boduch