Является ли lodash _.size() быстрее, чем свойство длины JS?

Статья (ссылка ниже) предполагает, что использование свойства length в строке создает ссылку на объект, которая излишне замедляет функцию вниз.

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

В этом контексте, в чем преимущество использования lodash _.size()? Выполняет ли оно что-либо иначе, чем свойство length (native...?)?

Если вы подсчитываете массив или ключи в объекте, можно ли использовать размер lodash вместо свойства length?

Ответ 1

Из источников _.size() реализуется как:

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

Для массива первая строка косвенно выполняет collection.length так что _.size(), если вообще, немного (крошечный) бит медленнее.

В статье о производительности проблема производительности заключается в том, что поиск свойств length используется, когда число в стеке могло быть использовано для достижения той же цели. Другими словами, решение заключалось не в поиске более быстрого свойства, а во избежании полного его использования, когда это можно было бы сделать.

Ответ 2

Функция size() наиболее полезна в цепочках, когда вам нужен размер результата. Нет смысла распаковывать все, используя значение(), чтобы получить размер. Например:

_(_.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() - это краткость кода, а не производительность.