Kodėl kas nors pirmenybę teiktų lodash.js arba underscore.js naudingumo bibliotekai, o ne kitai?
Atrodo, kad "Lodash" gali pakeisti "underscore", nes pastaroji egzistuoja ilgiau.
Manau, kad abi jos yra puikios, bet nežinau pakankamai apie jų veikimą, kad galėčiau jas pagrįstai palyginti, ir norėčiau daugiau sužinoti apie skirtumus.
Sukūriau "Lo-Dash", kad būtų užtikrintas nuoseklesnis matricų, eilučių, objektų ir argumentų
objektų iteracijos palaikymas įvairiose aplinkose1. Vėliau ji tapo "Underscore" rinkiniu, užtikrinančiu nuoseklesnę API elgseną, daugiau funkcijų (pavyzdžiui, AMD palaikymą, gilų klonavimą ir gilų sujungimą), išsamesnę dokumentaciją ir vienetinius testus (testus, kurie veikia "Node", "Ringo", "Rhino", "Narwhal", "PhantomJS" ir naršyklėse), geresnį bendrą našumą ir didelių masyvų / objektų iteracijos optimizavimą bei didesnį lankstumą naudojant pasirinktinius kūrimus ir šablonų išankstinio kompiliavimo įrankius.
Kadangi "Lo-Dash" atnaujinama dažniau nei "Underscore", siekiant užtikrinti suderinamumą su naujausia stabilia "Underscore" versija, pateikiamas "`lodash underscore" dieginys 5.
Vienu metu man netgi buvo suteikta push access prie Underscore, iš dalies dėl to, kad Lo-Dash yra atsakingas už daugiau nei 30 klausimų iškėlimą; klaidų ištaisymų, naujų funkcijų, & tobulinimo padidėjimą Underscore v1.4.x+.
Be to, yra bent 3 "Backbone" boilerplates, kuriuose pagal nutylėjimą yra "Lo-Dash", o "Lo-Dash" dabar minima oficialioje "Backbone" dokumentacijoje.
Išsamesnės informacijos apie Lo-Dash ir Underscore skirtumus rasite Kit Cambridge's įraše Say "Hello" to Lo-Dash.
Pastabos:
arguments
objektus. Naujesnėse naršyklėse Underscore metodai ignoruoja skyles masyvuose, "Objects" metodai iteruoja arguments
objektus, eilutės traktuojamos kaip masyvai, o metodai teisingai iteruoja funkcijas (ignoruodami jų "prototype" savybę) ir objektus (iteruodami šešėlines savybes, tokias kaip "toString" ir "valueOf"), o senesnėse naršyklėse to nedaro. Be to, tokie Underscore metodai kaip _.clone
išsaugo skyles masyvuose, o kiti, pavyzdžiui, _.flatten
- ne."Lo-Dash" yra įkvėptas pabraukimo simbolio, tačiau šiuo metu jis yra geresnis sprendimas. Galite kurti savo pasirinktines konstrukcijas, turėti didesnį našumą, palaikyti AMD ir turėti puikių papildomų funkcijų. Peržiūrėkite šį Lo-Dash vs Underscore lyginamąjį testą jsperf ir šį nuostabų įrašą apie lo-dash:
Viena iš naudingiausių funkcijų, kai dirbate su kolekcijomis, yra sutrumpinta sintaksė:
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 }]
(paimta iš lodash docs)
Be John'o atsakymo, ir skaitymo apie lodash (kurį iki šiol laikiau "me-too" į underscore), ir matydamas našumo testus, skaitydamas šaltinio kodą, ir tinklaraščio pranešimus, keli punktai, dėl kurių lodash yra daug pranašesnis už underscore, yra šie:
Jei pažvelgsite į underscore's išeities kodą, jau pirmose eilutėse pamatysite, kad underscore grįžta prie daugelio funkcijų gimtųjų realizacijų. Nors idealiame pasaulyje tai būtų buvęs geresnis požiūris, pažvelgus į kai kurias [šiose skaidrėse] pateiktas perf nuorodas (http://allyoucanleet.com/post/21624742336/jsconf-us-12-slides), nesunku padaryti išvadą, kad tų 'vietinių realizacijų' kokybė labai skiriasi tarp naršyklių. Kai kurias funkcijas "Firefox" atlieka velniškai greitai, o kai kuriose dominuoja "Chrome". (Įsivaizduoju, kad būtų scenarijų, kai dominuotų ir IE). Manau, kad'geriau rinktis kodą, kurio veikimas yra nuoseklesnis visose naršyklėse.
Perskaitykite ankstesnį tinklaraščio įrašą ir, užuot tikėję dėl jo, patys įvertinkite, atlikę lyginamuosius testus. Dabar esu apstulbęs, matydamas, kad lodash veikia 100-150 % greičiau nei underscore net paprastose, natyviose funkcijose, pavyzdžiui,
Array.every
, "Chrome"!
Čia pateikiamas skirtumų sąrašas tarp lodash ir jo's underscore-build - tai drop-in pakaitalas jūsų underscore projektams.