Различия между lodash и подчеркиванием
Почему кто-то предпочитает использовать библиотеку служебных программ lodash.js или underscore.js?
Lodash, похоже, является заменой замены для подчеркивания, последний из которых был длиннее.
Я думаю, что оба они блестящие, но я не знаю достаточно о том, как они работают, чтобы сделать образованное сравнение, и я хотел бы узнать больше о различиях.
Ответы
Ответ 1
Я создал Lo-Dash, чтобы обеспечить более согласованную поддержку итераций между средами для массивов, строк, объектов и объектов arguments
1. С тех пор он стал расширенным набором Underscore, предоставляя более согласованное поведение API, больше функций (таких как поддержка AMD, глубокое клонирование и глубокое слияние), более тщательную документацию и модульные тесты (тесты, которые выполняются в Node, Ringo, Rhino, Narwhal, PhantomJS и браузеры), лучшая общая производительность и оптимизация для больших итераций массивов/объектов, а также большая гибкость с помощью пользовательских сборок и утилит предварительной компиляции шаблонов.
Поскольку Lo-Dash обновляется чаще, чем Underscore, для обеспечения совместимости с последней стабильной версией Underscore предоставляется lodash underscore
.
В какой-то момент мне даже дали толчок доступ к Underscore, отчасти потому, что Lo-Dash отвечает за поднятие более 30 проблем; исправления ошибок при посадке, новые функции и улучшения в Underscore v1.4. x+.
Кроме того, есть как минимум 3 базовых шаблона Backbone, которые по умолчанию включают Lo-Dash, и теперь Lo-Dash упоминается в официальной документации Backbones.
Посмотрите статью Кит Кембридж, скажите "Привет" Lo-Dash, для более глубокого анализа различий между Lo-Dash и Underscore.
Примечания:
- Underscore имеет противоречивую поддержку массивов, строк, объектов и
arguments
объектов. В более новых браузерах методы Underscore игнорируют дыры в массивах, методы "Objects" перебирают объекты arguments
, строки обрабатываются как массивы, а методы корректно перебирают функции (игнорируя их свойство "prototype") и объекты (итерируя теневые свойства, такие как "toString") и "valueOf"), тогда как в старых браузерах их не будет. Кроме того, методы Underscore, такие как _.clone
сохраняют дыры в массивах, в то время как другие, такие как _.flatten
этого не делают.
Ответ 2
Lo-Dash вдохновлен подчеркиванием, но в настоящее время это превосходное решение. Вы можете сделать свои пользовательские сборки, иметь более высокую производительность, поддерживать AMD и иметь отличные дополнительные функции. Проверьте тесты Lo-Dash vs Underscore на jsperf и.. этот удивительный пост о lo-dash:
Одна из наиболее полезных функций при работе с коллекциями - это сокращенный синтаксис:
var characters = [
{ 'name': 'barney', 'age': 36, 'blocked': false },
{ 'name': 'fred', 'age': 40, 'blocked': true }
];
// using "_.filter" callback shorthand
_.filter(characters, { 'age': 36 });
// using underscore
_.filter(characters, function(character) { return character.age === 36; } );
// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]
(взято из lodash docs)
Ответ 3
Если, как и я, вы ожидали список различий между подчеркиванием и lodash, есть руководство по переходу с подчеркивания на lodash.
Вот текущее состояние его для потомков:
-
_.any
is Lodash _.some
-
_.all
is Lodash _.every
-
_.compose
является Lodash _.flowRight
- Подчеркивание
_.contains
is Lodash _.includes
- Подчеркивание
_.each
не позволяет выйти, вернув false
-
_.findWhere
is Lodash _.find
- Подчеркивание
_.flatten
по умолчанию глубоко, а Lodash неглубоко - Underscore
_.groupBy
поддерживает iteratee, которому передаются параметры (value, index, originalArray)
, в то время как в Lodash, iteratee для _.groupBy
передается только один параметр: (value)
. - Подчеркивание
_.indexOf
с undefined
третьим параметром - Lodash _.indexOf
- Подчеркивание
_.indexOf
с 3-м параметром true
- это Lodash _.sortedIndexOf
- Подчеркивание
_.indexBy
является Lodash _.keyBy
- Подчеркиваем
_.invoke
является Lodash _.invokeMap
-
_.mapObject
is Lodash _.mapValues
- Подчеркивание
_.max
объединяет Lodash _.max
& _.maxBy
- Подчеркивание
_.min
сочетает в себе Lodash _.min
& _.minBy
- Подчеркивание
_.sample
объединяет Lodash _.sample
& _.sampleSize
- Подчеркивание
_.object
объединяет Lodash _.fromPairs
и _.zipObject
- Подчеркивать
_.omit
предикатом является Lodash _.omitBy
-
_.pairs
является Lodash _.toPairs
- Подчеркивать
_.pick
предикатом является Lodash _.pickBy
- Подчеркиваем
_.pluck
это Lodash _.map
- Подчеркивание
_.sortedIndex
объединяет Lodash _.sortedIndex
& _.sortedIndexOf
-
_.uniq
iteratee
является Lodash _.uniqBy
- Подчеркиваем
_.where
Лодаш _.filter
- Подчеркивание
_.isFinite
не Number.isFinite
с Number.isFinite
(например, _.isFinite('1')
возвращает true
в Underscore, но false
в Lodash) - Подчеркивание сокращений
_.matches
не поддерживает глубокие сравнения
(например, _.filter(objects, { 'a': { 'b': 'c' } })
) - Подчеркнуть ≥ 1.7 и синтаксис Lodash
_.template
_.template(string, option)(data)
- Кэши Lodash
_.memoize
похожи на объекты Map
- Lodash не поддерживает аргумент
context
для многих методов в пользу _.bind
- Lodash поддерживает неявные цепочки, ленивые цепочки и сочетания клавиш
- Lodash разделил свои перегруженные
_.head
, _.last
, _.rest
и & _.initial
на
_.take
, _.takeRight
, _.drop
, & _.dropRight
(то есть _.head(array, 2)
в Underscore - это _.take(array, 2)
в Lodash)
Ответ 4
В дополнение к ответу Джона и чтению на lodash (который я до сих пор считал "мной слишком", чтобы подчеркнуть), и просмотрев тесты производительности, прочитав исходный код и сообщения в блоге, несколько пунктов, которые делают lodash намного лучше, чем подчеркивание, следующие:
Вот список различий между lodash, и это underscore-build является заменой для ваших проектов подчеркивания.
Ответ 5
Это 2014 год и через пару лет слишком поздно. Тем не менее, я думаю, моя точка зрения:
ИМХО, эта дискуссия немного потухла. Цитирование вышеупомянутого сообщения в блоге:
Большинство библиотек утилиты JavaScript, таких как Underscore, Valentine и wu, полагайтесь на "родной-первый двойной подход". Этот подход предпочитает встроенных реализаций, возвращаясь к ванильному JavaScript, только если родной эквивалент не поддерживается. Но jsPerf показал интересный trend: самый эффективный способ перебора массива или массива чтобы избежать встроенных реализаций полностью, выбирая простые циклы.
Как будто "простые циклы" и "ванильный Javascript" более родны, чем реализации метода Array или Object. Боже...
Конечно, было бы неплохо иметь единственный источник истины, но нет. Даже если вам сказали иначе, нет Ванильного Бога, моя дорогая. Прости. Единственное предположение, которое действительно имеет место, заключается в том, что мы все пишем код Javascript, который нацелен на то, чтобы хорошо работать во всех основных браузерах, зная, что у всех из них разные реализации одних и тех же вещей. Мягко говоря, это сука. Но это предпосылка, нравится вам это или нет.
Возможно, вы работаете над крупномасштабными проектами, которые нуждаются в щедрой производительности, чтобы вы действительно видели разницу между итерациями 850 000 (подчеркивание) против 2500 000 (lodash) по списку за сек прямо сейчас!
Я для одного нет. Я имею в виду, что я работал над проектами, в которых мне приходилось решать проблемы производительности, но они никогда не были решены или вызваны ни Underscore, ни Lo-Dash. И если я не получу реальные различия в реализации и производительности (мы говорим о С++ прямо сейчас), давайте скажем цикл над итерируемым (объект или массив, разреженный или нет!), Я скорее не буду беспокоиться о каких-либо претензий, основанных на результатах эталонной платформы, которая уже упрямна.
Требуется только одно обновление, позволяющее описать Rhino, чтобы установить его методы реализации Array в режиме пожара таким образом, что ни один "метод средневековых циклов не работает лучше и навсегда, а еще что" священник может спорить о своем простом факте что все внезапные методы массива в FF намного быстрее, чем его/ее упрямый мозг. Человек, вы просто не можете обмануть среду выполнения, обманув среду выполнения! Подумайте об этом, продвигая...
ваш запасной пояс
... в следующий раз.
Итак, чтобы это было важно:
- Используйте Underscore, если вы в удобстве, не жертвуя родным ишем.
- Используйте Lo-Dash, если вы находитесь в удобстве и как его расширенный каталог функций (глубокая копия и т.д.), и если вам отчаянно нужна мгновенная производительность и, самое главное, не против поселения альтернативы, как только родной API затмевает ухоженные рабочие места. Это скоро произойдет. Период.
- Есть даже третье решение. DIY! Знайте свою среду. Знайте о несоответствиях. Прочтите их код (John-David и Джереми). Не используйте это или нет, не объясняя, почему действительно необходим уровень совместимости/совместимости, а также улучшает рабочий процесс или повышает производительность вашего приложения. Очень вероятно, что ваши требования удовлетворяются простым polyfill, который вы вполне можете написать себе. Обе библиотеки - просто ваниль с немного сахара. Они оба борется за то, кто слушает самый сладкий пирог. Но поверьте мне, в конце концов, оба только готовятся с водой. Там нет Ванильного Бога, поэтому не может быть ванильного папы, верно?
Выберите любой подход, который наиболее подходит вашим потребностям. Как обычно. Я бы предпочел, чтобы резервные копии реальных реализаций по сравнению с утомленными читами в режиме реального времени в любое время, но даже это кажется сейчас вопросом вкуса. Придерживайтесь качественных ресурсов, таких как http://developer.mozilla.com и http://caniuse.com, и все будет в порядке.
Ответ 6
Я согласен с большинством вещей, упомянутых здесь, но я просто хочу указать аргумент в пользу underscore.js: размер библиотеки.
В частности, если вы разрабатываете приложение или веб-сайт, предназначенный для использования в основном на мобильных устройствах, размер результирующего пакета и влияние на загрузку или время загрузки могут сыграть важную роль.
Для сравнения, эти размеры - те, которые я заметил с помощью source-map-explorer после запуска ионной подачи:
lodash: 523kB
underscore.js: 51.6kb
Ответ 7
Не уверен, что это означает OP, но я столкнулся с этим вопросом, потому что я искал список проблем, которые я должен учитывать при переходе от подчеркивания к lodash.
Я был бы очень признателен, если бы кто-то опубликовал статью с полным списком таких различий. Позвольте мне начать с того, что я усвоил, т.е. Вещи, из-за которых мой код взорвался при производстве:/):
-
_.flatten
в подчеркивании глубоко по умолчанию, и вы должны передать true как второй аргумент, чтобы сделать его мелким. В lodash по умолчанию он неглубокий и передается true, поскольку второй аргумент сделает его глубоким!:)
-
_.last
в нижнем подчеркивании принимает второй аргумент, который показывает, сколько элементов вы хотите. В lodash
такой опции нет. Вы можете эмулировать это с помощью .slice
-
_.first
(тот же выпуск)
-
_.template
в подчеркивании может использоваться многими способами, один из которых предоставляет строку шаблона и данные и возвращает HTML
назад (или, по крайней мере, то, как он работал некоторое время назад). В lodash
вы получаете функцию, которую вы должны затем подавать с данными.
-
_(something).map(foo)
работает в подчеркивании, но в lodash мне пришлось переписать его на _.map(something,foo)
. Возможно, это был только TypeScript
-issue
Ответ 8
Существует движение к объединению двух библиотек. Отличная идея, я думаю!
https://github.com/jashkenas/underscore/issues/2182
Ответ 9
http://benmccormick.org/2014/11/12/underscore-vs-lodash/
Последняя статья, сравнивающая их Бена Маккормика:
-
Lo-Dash API - это надмножество Underscore.
-
Под капотом [Lo-Dash] была полностью переписана.
-
Lo-Dash определенно не медленнее, чем Underscore.
-
Что добавила Lo-Dash?
- Улучшение юзабилити
- Дополнительная функциональность
- Повышение производительности
- Сокращенные синтаксисы для цепочки
- Пользовательские сборки используют только то, что вам нужно
- Семантическое управление версиями и покрытие 100% кода
Ответ 10
Я только нашел одно отличие, которое оказалось важным для меня. Неподчеркнутая совместимая версия lodash _.extend()
не копирует свойства или методы, определенные на уровне класса.
Я создал тест Jasmine в CoffeeScript, который демонстрирует это:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
К счастью, lodash.underscore.js
сохраняет поведение Underscore копирования всего, что для моей ситуации было желательным.
Ответ 11
lodash имеет _.mapValues()
, который идентичен недоэкспорту _.mapObject()
.
Ответ 12
В основном подчеркивание - это подмножество lodash. Время от времени, как и в настоящее время, подчеркивание будет иметь небольшие небольшие функции, которые lodash не имеет, как mapObject. Это спасло меня много времени в разработке моего проекта.
Ответ 13
Они очень похожи, с Лодашем в данный момент вступает во владение...
Они оба являются утилитарной библиотекой, которая берет мир полезности в JavaScript...
Кажется, что Lodash теперь обновляется более регулярно, поэтому его чаще используют в последних проектах...
Кроме того, Lodash кажется немного легче на пару килобайт...
Оба имеют хороший API и док, но я думаю, что Lodash один лучше...
Вот скриншот для каждого из документов для получения первого значения массива...
нижнее подчеркивание:
Лодаш:
Поскольку вещи могут обновляться время от времени, просто проверьте их веб-сайт также...
lodash
нижнее подчеркивание
Ответ 14
Они очень похожи, с Лодашем...
Они оба являются утилитарной библиотекой, которая берет мир полезности в JavaScript...
Кажется, что Lodash теперь обновляется более регулярно, поэтому его чаще используют в последних проектах...
Кроме того, Lodash кажется легче на пару килобайт...
Оба имеют хороший API и док, но я думаю, что Lodash один лучше...
Вот скриншот для каждого документа для получения первого значения массива...
нижнее подчеркивание:
Лодаш:
Поскольку вещи могут обновляться время от времени, просто проверьте их веб-сайт также...
lodash
нижнее подчеркивание