Различия между lodash и подчеркиванием
Почему кто-то предпочитает библиотеку утилит lodash.js или http://underscorejs.org/ другим?
Lodash, кажется, является заменой нижнего подчеркивания, последний был дольше.
Я думаю, что оба великолепны, но я не знаю достаточно о том, как они работают, чтобы сделать образованное сравнение, и я хотел бы узнать больше о различиях.
11 ответов
Я создал Lo-Dash, чтобы обеспечить более согласованную поддержку итераций между средами для массивов, строк, объектов и arguments
объекты1. С тех пор он стал расширенным набором Underscore, предоставляя более согласованное поведение API, больше функций (таких как поддержка AMD, глубокое клонирование и глубокое слияние), более тщательную документацию и модульные тесты (тесты, которые выполняются в Node, Ringo, Rhino, Narwhal, PhantomJS и браузеры), лучшая общая производительность и оптимизация для больших итераций массивов / объектов, а также большая гибкость с помощью пользовательских сборок и утилит предварительной компиляции шаблонов.
Поскольку Lo-Dash обновляется чаще, чем Underscore, lodash underscore
Для обеспечения совместимости с последней стабильной версией Underscore предоставляется build.
В какой-то момент мне даже дали толчок доступ к Underscore, отчасти потому, что Lo-Dash отвечает за поднятие более 30 проблем; исправление ошибок при посадке, новые функции и улучшения в Underscore v1.4.x+.
Кроме того, есть как минимум 3 базовых шаблона Backbone, которые по умолчанию включают Lo-Dash, и теперь Lo-Dash упоминается в официальной документации Backbone.
Посмотрите статью Кит Кембриджа " Скажи" Привет "Ло-Дашу", чтобы узнать о различиях между Ло-Даш и Ундерскор.
Примечания:
- Underscore имеет противоречивую поддержку для массивов, строк, объектов и
arguments
объекты. В более новых браузерах методы Underscore игнорируют дыры в массивах, методы "Objects" повторяютсяarguments
объекты, строки обрабатываются как массивы, а методы правильно итерируют функции (игнорируя их свойство "prototype") и объекты (итерируя теневые свойства, такие как "toString" и "valueOf"), в то время как в старых браузерах они этого не делают. Кроме того, подчеркивают методы, такие как_.clone
сохранить дыры в массивах, в то время как другие любят_.flatten
нет.
Lo-Dash вдохновлен подчеркиванием, но в настоящее время это превосходное решение. Вы можете создавать свои собственные сборки, иметь более высокую производительность, поддерживать AMD и иметь отличные дополнительные функции. Проверьте этот тест Lo-Dash и 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)
Если вы, как и я, ожидали списка различий между подчеркиванием и lodash, есть руководство по переходу с подчеркивания на lodash.
Вот текущее состояние для потомков:
- Нижнее подчеркивание
_.compose
это Лодаш_.flowRight
- Нижнее подчеркивание
_.contains
это Лодаш_.includes
- Нижнее подчеркивание
_.findWhere
это Лодаш_.find
- Нижнее подчеркивание
_.invoke
это Лодаш_.invokeMap
- Нижнее подчеркивание
_.mapObject
это Лодаш_.mapValues
- Нижнее подчеркивание
_.pluck
это Лодаш_.map
- Нижнее подчеркивание
_.where
это Лодаш_.filter
- Нижнее подчеркивание
_.any
это Лодаш_.some
- Нижнее подчеркивание
_.all
это Лодаш_.every
- Нижнее подчеркивание
_.each
не позволяет выйти, вернувшисьfalse
- Нижнее подчеркивание
_.flatten
по умолчанию глубокий, а мелкий Lodash- Нижнее подчеркивание
_.isFinite
не совпадает сNumber.isFinite
(например_.isFinite('1')
возвращаетсяtrue
в нижней части, ноfalse
в Лодаш)- Нижнее подчеркивание
_.matches
стенография не поддерживает глубокие сравнения
(например_.filter(objects, { 'a': { 'b': 'c' } })
)- Подчеркните ≥ 1,7 & Lodash изменили свои
_.template
синтаксис для_.template(string, option)(data)
- Lodash
_.uniq
не принимаетiteratee
функционируют как Ундерскор. Используйте Lodash_.uniqBy
- Lodash
_.first
а также._last
не приниматьn
аргумент, как у Ундерскора использованиеslice
- Lodash
_.memoize
кешиMap
как объекты- Lodash поддерживает неявные цепочки, ленивые цепочки и сочетания клавиш
- Лодаш разделил свою перегруженную
_.head
,_.last
,_.rest
&_.initial
в_.take
,_.takeRight
,_.drop
&_.dropRight
(т.е._.head(array, 2)
в нижней части есть_.take(array, 2)
в Лодаш)
В дополнение к ответу Джона и чтению lodash (которое я до сих пор считал "я тоже", чтобы подчеркнуть), а также ознакомлению с тестами производительности, чтением исходного кода и сообщениями в блоге, некоторые моменты, которые делают lodash намного лучше, чем подчеркнуть это:
Дело не в скорости, а в постоянстве скорости (?)
Если вы посмотрите на исходный код подчеркивания, вы увидите в первых нескольких строках, которые подчеркивают откат к собственным реализациям многих функций. Хотя в идеальном мире это был бы лучший подход, если вы посмотрите на некоторые ссылки на Perf, приведенные на этих слайдах, нетрудно сделать вывод, что качество этих "нативных реализаций" сильно варьируется в зависимости от браузера. в браузере. Firefox чертовски быстр в некоторых функциях, а в некоторых Chrome доминирует. (Я предполагаю, что были бы некоторые сценарии, где IE также доминировал бы). Я считаю, что лучше отдать предпочтение коду, чья производительность более стабильна во всех браузерах.
Читайте пост в блоге ранее, и вместо того, чтобы верить в это ради самого себя, судите сами, выполняя тесты. Я сейчас ошеломлен, когда вижу, что lodash работает на 100-150% быстрее, чем подчеркивание даже в простых, нативных функциях, таких как
Array.every
в хроме!Дополнения в lodash также весьма полезны.
- Что касается высоко оцененного комментария Xananax, предлагающего вклад в код подчеркивания: всегда лучше иметь ХОРОШУЮ конкуренцию, она не только поддерживает инновации, но и заставляет вас поддерживать себя (или свою библиотеку) в хорошей форме.
Вот список различий между lodash, и его подчеркивание - это замена для ваших проектов подчеркивания.
Это 2014 год и на пару лет поздно. Тем не менее я думаю, что моя точка зрения верна:
ИМХО, эта дискуссия разлетелась совсем немного. Цитирую вышеупомянутую запись в блоге:
Большинство утилитарных библиотек JavaScript, таких как Underscore, Valentine и wu, полагаются на "родной-первый двойной подход". Этот подход предпочитает нативные реализации, возвращаясь к ванильному JavaScript, только если нативный эквивалент не поддерживается. Но jsPerf обнаружил интересную тенденцию: наиболее эффективный способ перебора массива или массива, подобного массиву, - полностью избежать нативных реализаций, выбрав вместо этого простые циклы.
Как будто "простые циклы" и "ванильный Javascript" являются более нативными, чем реализации метода Array или Object. Боже...
Конечно, было бы неплохо иметь единый источник правды, но это не так. Даже если бы тебе сказали иначе, ванильного бога нет, моя дорогая. Мне жаль. Единственное предположение, которое действительно верно, заключается в том, что мы все пишем код Javascript, который нацелен на то, чтобы хорошо работать во всех основных браузерах, зная, что у всех них есть разные реализации одних и тех же вещей. С этим сука, мягко говоря, справиться. Но это предпосылка, нравится вам это или нет.
Возможно, вы все работаете над крупномасштабными проектами, для которых нужна твиттерская производительность, так что вы действительно видите разницу между 850000 (подчеркивание) и 2 500 000 (lodash) итерациями по списку в секунду прямо сейчас!
Я, например, нет. Я имею в виду, я работал над проектами, где мне приходилось решать проблемы с производительностью, но они никогда не были решены или вызваны ни Underscore, ни Lo-Dash. И пока я не пойму реальные различия в реализации и производительности (мы сейчас говорим о C++), скажем, цикла над итеративным (объект или массив, разреженным или нет!), Я скорее не буду беспокоиться о каких-либо претензии, основанные на результатах эталонной платформы, которая уже высказана.
Нужно всего лишь одно обновление, скажем, Rhino, чтобы зажечь свои реализации метода Array таким образом, чтобы ни один "средневековый цикл не работал лучше и навсегда, а священник с чем-то еще" мог спорить о том, что все Методы внезапного массива в FF намного быстрее, чем его / ее самоуверенный бред. Чувак, ты просто не можешь обмануть свою среду выполнения, обманув свою среду выполнения! Подумайте об этом при продвижении...
ваш сервисный пояс
... в следующий раз.
Итак, чтобы сохранить это актуальным:
- Используйте Underscore, если вам удобнее, не жертвуя нативным ишем.
- Используйте Lo-Dash, если вам удобно, и вам нравится его расширенный каталог функций (глубокое копирование и т. Д.), И если вы остро нуждаетесь в мгновенной производительности и, самое главное, не возражаете против выбора альтернативы, как только устаревший API упрямые обходные пути. Что скоро случится. Период.
- Есть даже третье решение. DIY! Знай свое окружение. Знайте о несоответствиях. Прочитайте их ( Джон-Дэвид и Джереми) код. Не используйте то или это, не имея возможности объяснить, почему действительно необходим уровень согласованности / совместимости, который улучшает рабочий процесс или повышает производительность вашего приложения. Весьма вероятно, что ваши требования будут удовлетворены простым полифилом, который вы сможете написать самостоятельно. Обе библиотеки - просто ваниль с небольшим количеством сахара. Они оба борются за то, кто подает сладкий пирог. Но, поверьте мне, в итоге оба готовят только с водой. Нет ванильного бога, поэтому не может быть и ванильного папы, верно?
Выберите подход, который больше всего соответствует вашим потребностям. По-прежнему. Я бы предпочел в любое время отступать от реальных реализаций, а не надуманных читов времени выполнения, но даже сейчас это кажется делом вкуса. Придерживайтесь качественных ресурсов, таких как http://developer.mozilla.com/ и http://caniuse.com/ и все будет в порядке.
Я согласен с большинством сказанного здесь, но я просто хочу указать на аргумент в пользу underscore.js: размер библиотеки.
Особенно в случае, если вы разрабатываете приложение или веб-сайт, который намеревается использовать в основном на мобильных устройствах, размер результирующего пакета и влияние на время загрузки или загрузки могут играть важную роль.
Для сравнения, эти размеры те, что я заметил с source-map-explorer после запуска ionic serve:
lodash: 523kB
underscore.js: 51.6kb
Не уверен, что именно это и имел в виду OP, но я столкнулся с этим вопросом, потому что искал список проблем, о которых нужно помнить при переходе с подчеркивания на lodash.
Я был бы очень признателен, если бы кто-то опубликовал статью с полным списком таких различий. Позвольте мне начать с вещей, которые я усвоил трудным путем (то есть вещей, которые заставили мой код взорваться на производстве:/):
_.flatten
по умолчанию значение подчеркивания является глубоким, и вы должны передать true в качестве второго аргумента, чтобы сделать его поверхностным. В lodash по умолчанию он неглубокий, и передача true в качестве второго аргумента сделает его глубоким!:)_.last
в подчеркивании принимает второй аргумент, который говорит, сколько элементов вы хотите. Вlodash
такой опции нет. Вы можете подражать этому с.slice
_.first
(та же проблема)_.template
в подчеркивании может использоваться многими способами, одним из которых является предоставление строки шаблона и данных и получениеHTML
назад (или, по крайней мере, так это было когда-то). Вlodash
Вы получаете функцию, которую вы должны затем передать с данными._(something).map(foo)
работает в подчеркивании, но в lodash мне пришлось переписать его_.map(something,foo)
, Возможно, это было простоTypeScript
-эмиссионный
http://benmccormick.org/2014/11/12/underscore-vs-lodash/
Последняя статья, в которой сравниваются две работы Бена Маккормика:
API Lo-Dash - это расширенный набор Underscore.
Под капотом [Lo-Dash] была полностью переписана.
Lo-Dash определенно не медленнее, чем Underscore.
Что добавил Lo-Dash?
- Улучшения юзабилити
- Дополнительная функциональность
- Прирост производительности
- Сокращенные синтаксисы для создания цепочек
- Пользовательские сборки, использующие только то, что вам нужно
- Семантическая версия и 100% покрытие кода
Я только нашел одно различие, которое оказалось важным для меня. Не подчеркивающая версия lodash's _.extend()
не копирует определенные на уровне класса свойства или методы.
Я создал тест Жасмин в CoffeeScript, который демонстрирует это:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
К счастью, lodash.underscore.js
сохраняет поведение Underscore копировать все, что для моей ситуации было желаемым поведением.
Лодаш получил _.mapValues()
который идентичен underescore's _.mapObject()
,
По большей части подчеркивание является подмножеством lodash. Время от времени, как в настоящее время подчеркивание, будет иметь классные маленькие функции, которые lodash не имеет, как mapObject. Этот сэкономил мне много времени при разработке моего проекта.
Они очень похожи, с Лодашем...
Они оба являются утилитарной библиотекой, которая берет мир полезности в JavaScript...
Кажется, что Lodash теперь обновляется более регулярно, поэтому его чаще используют в последних проектах...
Кроме того, Lodash кажется легче на пару килобайт...
Оба имеют хороший API и док, но я думаю, что Lodash один лучше...
Вот скриншот для каждого из документов для получения первого значения массива...
нижнее подчеркивание:
Поскольку вещи могут обновляться время от времени, просто проверьте их веб-сайт также...