Różnice między lodash a underscore

Dlaczego ktoś wolałby albo lodash.JS lub .js utility library nad drugą?

Lodash wydaje się być zastępstwem dla podkreślenia, ten ostatni jest już w pobliżu.

Myślę, że oba są genialne, ale nie wiem wystarczająco dużo o tym, jak działają, aby dokonać wykształconego porównania, i chciałbym wiedzieć więcej o różnicach.

Author: Cœur, 2012-12-09

11 answers

Stworzyłem Lo-Dash, aby zapewnić bardziej spójną obsługę iteracji między środowiskami dla tablic, łańcuchów, obiektów i obiektów arguments1. Od tego czasu stał się supersetem podkreślenia, zapewniając bardziej spójne zachowanie API, więcej funkcji (takich jak obsługa AMD, deep clone i deep merge), dokładniejszą dokumentację i testy jednostkowe (testy uruchamiane w Node, Ringo, Rhino, Narwhal, PhantomJS i przeglądarkach), lepszą ogólną wydajność i optymalizacje dla dużych iteracja tablic/obiektów i większa elastyczność dzięki niestandardowym kompilacjom i narzędziom preinstalacji szablonów.

Ponieważ Lo - Dash jest aktualizowany częściej niż podkreślnik, dostarczany jest lodash underscore build , aby zapewnić kompatybilność z najnowszą stabilną wersją Podkreślnika.

W pewnym momencie dostałem nawet push access do podkreślenia, częściowo dlatego, że Lo-Dash jest odpowiedzialny za podnoszenie ponad 30 problemów; poprawki błędów, nowe funkcje, & zyski perf w Underscore v1. 4.x+.

Ponadto istnieją co najmniej 3 szkielet szkieletu, które domyślnie zawierają Lo-Dash, A Lo-Dash jest teraz wymieniony w oficjalnej dokumentacji szkieletu .

Zobacz post Kit Cambridge, przywitaj się z Lo-Dash, aby dowiedzieć się więcej o różnicach między Lo-Dash i Underscore.

Przypisy:

  1. podkreślenie ma niespójne wsparcie dla tablic, łańcuchów, obiektów i obiektów arguments. W nowszych przeglądarkach, Metody podkreślenia ignorują otwory w tablicach , metody "Objects" iterują arguments obiekty, łańcuchy są traktowane jako podobne do tablic, a metody poprawnie iterują funkcje (ignorując ich Właściwość "prototype") i Obiekty (iterują właściwości cieniowane, takie jak "ToString" i "valueOf"), podczas gdy w starszych przeglądarkach nie będą. Ponadto, metody podkreślenia, takie jak _.clone, zachowują dziury w tablicach, podczas gdy inne, takie jak _.flatten, nie.
 1812
Author: John-David Dalton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 07:29:15

Lo-Dash jest inspirowany podkreśleniem, ale obecnie jest lepszym rozwiązaniem. Możesz tworzyć własne Kompilacje , mieć wyższą wydajność, obsługiwać AMD i mieć wspaniałe dodatkowe funkcje. Sprawdź to lo-Dash vs underscore benchmarki {[3] } na jsperf i.. this awesome post about lo-dash :

Jedną z najbardziej przydatnych funkcji podczas pracy z kolekcjami jest skrócona składnia:

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 }]

(zaczerpnięte z lodash docs )

 168
Author: neiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 18:23:46

Lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash, lodash,]}

  1. Nie chodzi o prędkość, tylko o spójność prędkości (?)

    Jeśli przyjrzysz się kodowi źródłowemu podkreślenia, zobaczysz w kilku pierwszych linijkach podkreślenia falls-powrót do natywnych implementacji wielu funkcji. Chociaż w idealnym świecie byłoby to lepsze podejście, jeśli spojrzeć na niektóre linki perf podane w tych slajdów , nie jest trudno wyciągnąć wniosek, że jakość tych "natywnych implementacji" różni się znacznie od przeglądarki. Firefox jest cholernie szybki w niektórych funkcjach, a w niektórych Chrome dominuje. (Wyobrażam sobie, że będą pewne scenariusze, w których IE też dominowałby). Wierzę, że lepiej jest preferuj kod, którego wydajność jest bardziej spójna we wszystkich przeglądarkach.

    Przeczytaj post na blogu wcześniej i zamiast wierzyć w to ze względu na to, oceń sam, uruchamiając benchmarki . Jestem oszołomiony, widząc lodash wykonujący 100-150% szybciej niż podkreślenie w nawet prosty, natywne funkcje takie jak Array.every w Chrome!

  2. Bardzo przydatne są również dodatki w lodash.

  3. Jak dla Bardzo upvoted komentarz xananax sugeruje wkład do kodu podkreślenia: zawsze lepiej mieć dobrą konkurencję, nie tylko utrzymuje innowacje, ale także napędza cię do utrzymania siebie (lub biblioteki) w dobrej formie.

Oto lista różnic Pomiędzy lodashem,a jego podkreślnikiem-build jest zamiennikiem dla Twoich projektów podkreślnika.

 58
Author: kumar_harsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-07 08:43:18

Lodash lodash jest jednym z najbardziej rozpoznawalnych i najbardziej rozpoznawalnych języków programowania na świecie, w którym można znaleźć wiele różnych stylów językowych, takich jak np.: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

Oto obecny stan dla potomności:

  • podkreślenie _.compose jest Lodash _.flowRight
  • podkreślenie _.contains jest Lodash _.includes
  • podkreślenie _.findWhere jest Lodash _.find
  • podkreślenie _.invoke jest Lodash _.invokeMap
  • podkreślenie _.mapObject jest Lodash _.mapValues
  • podkreślenie _.pluck jest Lodash _.map
  • podkreślenie _.where jest Lodash _.filter
  • podkreślenie _.any jest Lodash _.some
  • podkreślenie _.all jest Lodash _.every
  • podkreślenie _.each nie pozwala na wyjście przez zwrócenie false
  • podkreślenie _.flatten jest domyślnie Głębokie, podczas gdy Lodash jest płytkie
  • podkreślenie _.isFinite nie zgadza się z Number.isFinite
    (np. _.isFinite('1') zwraca true W Podkreślniku, ale false w Lodash)
  • podkreślenie _.matches Stenografia nie obsługuje głębokich porównań
    (np. _.filter(objects, { 'a': { 'b': 'c' } }))
  • podkreślenie ≥ 1.7 & Lodash zmienili składnię _.template na
    _.template(string, option)(data)
  • Lodash lodash nie akceptuje funkcji typu Underscore. użyj Lodash _.uniqBy
  • Lodash _.first i ._last nie akceptują argumentu n Jak podkreślenia. użyj slice
  • Lodash _.memoize caches są Map jak obiekty
  • Lodash wspiera , lazy łańcuchowanie, & Skrót fuzja
  • Lodash podzielił swoje przeciążone _.head, _.last, _.rest, & _.initial out into
    _.take, _.takeRight, _.drop, & _.dropRight
    (tzn. _.head(array, 2) w podkreśleniu jest _.take(array, 2) W Lodash)
 57
Author: Iest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 09:35:51

Jest rok 2014 i o kilka lat za późno. Nadal myślę, że mój punkt trzyma:

IMHO ta dyskusja trochę przesadziła. Cytując wspomniany post na blogu :

Większość bibliotek narzędzi JavaScript, takich jak Underscore, Valentine i wu, polegaj na " natywnym-pierwszym podwójnym podejściu."Takie podejście preferuje implementacji natywnych, spadając z powrotem do JavaScript tylko wtedy, gdy natywny odpowiednik nie jest obsługiwany. Ale jsperf ujawnił ciekawe trend: najbardziej efektywny sposób iteracji tablicy lub tablicy kolekcji ma całkowicie unikać implementacji natywnych, decydując się na proste pętle zamiast.

Jakby "simple loops" i "vanilla Javascript" były bardziej natywne niż implementacje metod tablicowych lub obiektowych. Jezu ...

Z pewnością byłoby miło mieć jedno źródło prawdy, ale nie ma. nawet jeśli powiedziano ci inaczej, nie ma Boga waniliowego, moja droga. Przepraszam. Jedyny założenie, że naprawdę trzyma jest to, że wszyscy piszemy kod Javascript, który ma na celu wykonanie dobrze we wszystkich głównych przeglądarkach, wiedząc, że wszystkie z nich mają różne implementacje tych samych rzeczy. To suka do radzenia sobie, delikatnie mówiąc. Ale to jest założenie, czy ci się to podoba, czy nie.

Może pracujecie nad dużymi projektami, które wymagają wydajności Twittera, aby naprawdę zobaczyć różnicę pomiędzy 850 000 (podkreślenie) a 2 500 000 (lodash) iteracjami nad listą na sekundę Teraz!

Nie jestem. Pracowałem nad projektami, w których musiałem rozwiązywać problemy z wydajnością, ale nigdy nie zostały one rozwiązane ani spowodowane przez podkreślenie, ani Lo-Dash. I chyba, że uchwycę rzeczywiste różnice w implementacji i wydajności (mówimy teraz C++) powiedzmy pętli nad iterowalnym (obiekt lub tablica, rzadkie lub nie!), Raczej nie przejmuję się żadnymi roszczeniami na podstawie wyników platformy benchmarkowej, która jest już / align = "left" /

Potrzebna jest tylko jedna aktualizacja lets say Rhino, aby podpalić implementacje metod Array w taki sposób, że ani jeden "Medieval loop methods performing better and forever and whatnot" priest może argumentować swoją drogę wokół prostego faktu, że nagle metody array w FF są znacznie szybsze niż jego/jej opinioned brainfuck. Człowieku, po prostu nie można oszukać środowiska uruchomieniowego, oszukując środowisko uruchomieniowe! Pomyśl o tym podczas promocji ...

Twój pas użytkowy

... następnym razem.

Tak aby było istotne:

  • użyj podkreślenia, jeśli lubisz wygodę bez poświęcania natywnego charakteru.
  • użyj Lo-Dash, jeśli lubisz wygodę i rozszerzony katalog funkcji (Głębokie kopiowanie itp.) i jeśli desperacko potrzebujesz natychmiastowej wydajności, a co najważniejsze nie masz nic przeciwko temu, aby jak tylko natywne API przyćmiło pracę. Który idzie wkrótce. Kropka.
  • Jest nawet trzecie rozwiązanie. DIY! Poznaj swoje otoczenie. Wiedzieć o niespójności. Przeczytaj ich (John-David 'S I Jeremy 'S) Kod. Nie używaj tego lub tamtego bez możliwości wyjaśnienia, dlaczego warstwa spójności/zgodności jest naprawdę potrzebna i usprawnia przepływ pracy lub poprawia wydajność aplikacji. Jest bardzo prawdopodobne, że Twoje wymagania są spełnione dzięki prostemu polyfillowi, który jesteś w stanie samodzielnie napisać. Obie to zwykła wanilia z odrobiną cukru. Oboje walczą o to, kto podaje najsłodsze ciasto. Ale uwierz mi, w końcu oba gotują tylko z wodą. Nie ma waniliowego Boga, więc nie może być waniliowego papieża, prawda?

Wybierz to, co najbardziej pasuje do Twoich potrzeb. Jak zwykle. Wolę zastępstwo na rzeczywistych implementacjach niż opiniowane kody uruchomieniowe w każdej chwili, ale nawet to wydaje się być kwestią gustu w dzisiejszych czasach. Trzymaj się jakości zasoby jak http://developer.mozilla.com i http://caniuse.com i nic Ci nie będzie.

 43
Author: Lukas Bünger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-12 00:14:38

Zgadzam się z większością rzeczy tutaj powiedzianych, ale chcę tylko wskazać argument na rzecz podkreślenia.js: wielkość biblioteki.

Szczególnie w przypadku, gdy tworzysz aplikację lub stronę internetową, która ma być używana głównie na urządzeniach mobilnych, rozmiar uzyskanego pakietu i wpływ na czas rozruchu lub pobierania mogą mieć ważną rolę.

Dla porównania, te rozmiary to te, które zauważyłem z source-map-explorer po uruchomieniu ionic serve:

lodash: 523kB
underscore.js: 51.6kb
 15
Author: David Dal Busco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 14:20:40

Nie wiem, czy o to chodziło OP, ale przychodziłem do tego pytania, ponieważ szukałem listy problemów, o których muszę pamiętać podczas migracji z podkreślenia do lodash.

Byłbym naprawdę wdzięczny, gdyby ktoś opublikował artykuł z pełną listą takich różnic. Zacznę od rzeczy, których nauczyłem się na własnej skórze (czyli rzeczy, które sprawiły, że mój kod eksplodował podczas produkcji:/): {]}

  • _.flatten w podkreślenie jest domyślnie głębokie i musisz przejść prawda jako drugi argument, aby uczynić go płytkim. W lodash domyślnie jest płytka, a podanie true jako drugiego argumentu sprawi, że będzie głęboka! :)
  • _.last w podkreślniku przyjmuje drugi argument, który mówi, ile elementów chcesz. W lodash nie ma takiej opcji. Możesz to emulować za pomocą .slice
  • _.first (ten sam numer)
  • _.template w podkreślniku może być używany na wiele sposobów, z których jednym jest podanie ciągu szablonu i danych oraz uzyskanie HTML z powrotem (a przynajmniej tak to wygląda pracował jakiś czas temu). W lodash otrzymujesz funkcję, którą następnie przesyłasz danymi.
  • _(something).map(foo) działa w podkreślniku, ale w lodash musiałem go przepisać na _.map(something,foo). Być może to był tylko TypeScript-problem
 10
Author: qbolec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 13:46:50

Http://benmccormick.org/2014/11/12/underscore-vs-lodash/

Ostatni artykuł porównujący dwa BEN McCormick:

  1. API Lo-Dash jest supersetem Podkreślników.

  2. Pod maską [Lo-Dash] został całkowicie przepisany.

  3. Lo-Dash zdecydowanie nie jest wolniejszy od podkreślenia.

  4. Co dodał Lo-Dash?

    • Ulepszenia Użyteczności
    • Dodatkowa Funkcjonalność
    • Wzrost Wydajności
    • składnia skrócona do łańcuchowania
    • Custom Builds to use only what you need
    • wersjonowanie semantyczne i 100% pokrycie kodu
 8
Author: pilau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-07 14:23:41

Znalazłem tylko jedną różnicę, która okazała się dla mnie ważna. Wersja _.extend() lodash, która nie jest zgodna z podkreśleniem, nie kopiuje Właściwości lub metod zdefiniowanych na poziomie klasy.

Stworzyłem Test Jasmine w CoffeeScript, który to demonstruje:

Https://gist.github.com/softcraft-development/1c3964402b099893bd61

Na szczęście, lodash.underscore.js zachowuje zachowanie podkreślenia kopiowania wszystkiego, co dla mojej sytuacji było pożądane zachowanie.

 6
Author: Craig Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 16:56:40

Lodash mA _.mapValues(), który jest identyczny z pod _.mapObject().

 3
Author: artknight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 14:50:16

W większości przypadków podkreślenie jest podzbiorem lodash. Czasami, tak jak obecnie, underscore będzie miał fajne małe funkcje, których lodash nie ma jak mapObject. Ten zaoszczędziło mi dużo czasu w rozwoju mojego projektu.

 0
Author: rashadb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 11:16:42