Birisi neden lodash.js veya underscore.js yardımcı kütüphanesini diğerine tercih eder?
Lodash, daha uzun süredir var olan underscore'un yerine geçecek gibi görünüyor.
Bence her ikisi de harika, ancak eğitimli bir karşılaştırma yapmak için nasıl çalıştıkları hakkında yeterince bilgim yok ve farklılıklar hakkında daha fazla bilgi edinmek istiyorum.
Lo-Dash'i diziler, dizeler, nesneler ve `arguments' nesneleri için daha tutarlı ortamlar arası yineleme desteği sağlamak için yarattım1. O zamandan beri daha tutarlı API davranışı, daha fazla özellik (AMD desteği, derin klonlama ve derin birleştirme gibi), daha kapsamlı dokümantasyon ve birim testleri (Node, Ringo, Rhino, Narwhal, PhantomJS ve tarayıcılarda çalışan testler), büyük diziler/nesne yinelemesi için daha iyi genel performans ve optimizasyonlar ve özel derlemeler ve şablon ön derleme yardımcı programları ile daha fazla esneklik sağlayarak Underscore'un bir üst kümesi haline geldi.
Lo-Dash, Underscore'dan daha sık güncellendiğinden, Underscore'un en son kararlı sürümüyle uyumluluğu sağlamak için bir `lodash underscore' derlemesi sağlanmıştır.
Bir noktada Underscore'a push erişimi bile verildi, çünkü kısmen Lo-Dash 30'dan fazla sorunu gündeme getirmekten sorumluydu; hata düzeltmeleri, yeni özellikler, & Underscore v1.4.x + 'daki perf kazanımları.
Buna ek olarak, varsayılan olarak Lo-Dash içeren en az 3 Backbone boilerplates vardır ve Lo-Dash artık Backbone'un resmi belgelerinde belirtilmiştir.
Lo-Dash ve Underscore arasındaki farkları daha derinlemesine incelemek için Kit Cambridge'in Say "Hello" to Lo-Dash başlıklı yazısına göz atın.
Dipnotlar:
arguments
nesneleri için tutarsız desteğe sahiptir. Yeni tarayıcılarda, Underscore yöntemleri dizilerdeki delikleri yok sayar, "Objects" yöntemleri arguments
nesnelerini yineler, dizeler dizi benzeri olarak ele alınır ve yöntemler işlevleri ("prototype" özelliklerini yok sayarak) ve nesneleri ("toString" ve "valueOf" gibi gölgeli özellikleri yineleyerek) doğru şekilde yinelerken, eski tarayıcılarda bunu yapmazlar. Ayrıca, _.clone
gibi Underscore yöntemleri dizilerdeki boşlukları korurken, _.flatten
gibi diğerleri korumaz.Lo-Dash, underscore'dan esinlenmiştir, ancak günümüzde üstün bir çözümdür. Özel derlemelerinizi]1 yapabilir, daha yüksek performansa sahip olabilir, AMD'yi destekleyebilir ve harika ekstra özelliklere sahip olabilirsiniz. Jsperf'teki bu Lo-Dash vs Underscore kıyaslamalarına ve bu lo-dash hakkındaki harika yazıya göz atın:
Koleksiyonlarla çalışırken en kullanışlı özelliklerden biri steno sözdizimidir:
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'dan alınmıştır)
John'un cevabına ek olarak, (şimdiye kadar underscore için "me-too" olarak gördüğüm) lodash'ı okumak ve performans testlerini görmek, kaynak kodunu okumak ve blog yazıları, lodash'ı underscore'dan çok daha üstün kılan birkaç nokta şunlardır:
Eğer underscore'un kaynak koduna bakarsanız, ilk birkaç satırda underscore'un birçok fonksiyonun yerel uygulamalarına geri döndüğünü göreceksiniz. İdeal bir dünyada bu daha iyi bir yaklaşım olurdu, ancak bu slaytlarda verilen bazı perf bağlantılarına bakarsanız, bu 'yerel uygulamaların' kalitesinin tarayıcıdan tarayıcıya çok değiştiği sonucuna varmak zor değildir. Firefox bazı işlevlerde çok hızlıdır ve bazılarında Chrome baskındır. (IE'nin de baskın olduğu bazı senaryolar olacağını hayal ediyorum). Tarayıcılar arasında performansı daha tutarlı olan bir kodu tercih etmenin daha iyi olduğuna inanıyorum.
Daha önceki blog yazısını okuyun ve ona inanmak yerine benchmark çalıştırarak kendiniz karar verin. Chrome'da `Array.every' gibi basit, yerel fonksiyonlarda bile lodash'in underscore'dan % 100-150 daha hızlı çalıştığını görmek beni hayrete düşürdü!
İşte lodash arasındaki farklılıkların listesi ve underscore-build, underscore projeleriniz için bir drop-in yerine geçer.