lodash _.size() 比 JS length 属性 快吗?

Is lodash _.size() faster than JS length property?

文章(下面的 link)建议在字符串上使用长度 属性 会创建一个对象引用,这会不必要地减慢函数速度。

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

在这种情况下,使用 lodash _.size() 的优势是什么?它的表现与(原生...?)长度 属性 有什么不同吗?

如果您要对对象中的数组或键进行计数,使用 lodash 大小而不是长度 属性 有什么好处吗?

从 lodash 来源,_.size() 实现为:

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

对于一个数组,第一行是间接地做 collection.length 所以 _.size() 如果有的话,稍微慢一点。

在性能文章中,性能问题是 length 的 属性 查找被使用,而堆栈上的数字本可以用于实现相同的目标。换句话说,解决方案不是寻找更快的 属性,而是在可能的情况下完全避免 属性。

size() function is most useful in chains, when you need the size of the result. There's no point in unpacking everything using 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() 是关于代码简洁性,而不是性能。

https://www.measurethat.net/Benchmarks/Show/17859/3/native-filterlength-vs-lodash-sumby-vs-lodash-filtersiz 表示 array.filter(testFunction).length 比在 Firefox 上使用 _(array).filter(testFunction).size() 和 Chrome 等 lodash 更快,截至 2022 年 3 月 22 日。

那 link 也显示了一种更快的方法来做同样的事情。我假设更快的方法更快,因为它不需要创建一个新数组并将过滤后的元素添加到该数组,就像 filter()array.filter(testFunction).length.

中所做的那样