Mengapa seseorang lebih baik lodash.js atau underscore.js utilitas perpustakaan lebih dari yang lain?
Lodash tampaknya menjadi pengganti drop-in untuk menggarisbawahi, yang terakhir yang telah di sekitar lagi.
Saya pikir keduanya brilian, tapi saya tidak cukup tahu tentang bagaimana mereka bekerja untuk membuat aplikasi yang berpendidikan perbandingan, dan saya ingin tahu lebih banyak tentang perbedaan-perbedaan.
Saya buat Lo-Dash untuk memberikan lebih konsisten cross-lingkungan iterasi dukungan untuk array, string, objek, dan argumen
benda1. Sejak itu menjadi superset dari Garis bawah, menyediakan lebih konsisten API perilaku, lebih fitur (seperti AMD dukungan, jauh clone, dan mendalam merge), lebih menyeluruh dokumentasi dan unit tes (tes yang dijalankan di Node, Ringo, Badak, Narwhal, PhantomJS, dan browser), baik secara keseluruhan kinerja dan optimasi untuk array besar/objek iterasi, dan lebih banyak fleksibilitas dengan membangun kustom dan template pra-kompilasi utilitas.
Karena Lo-Dasbor diperbarui lebih sering dari Garis bawah, sebuah lodash underscore
membangun diberikan untuk memastikan kompatibilitas dengan versi stabil terbaru dari Bawah.
Pada satu titik aku bahkan diberikan mendorong akses untuk Menggarisbawahi, sebagian karena Lo-Dash adalah bertanggung jawab untuk meningkatkan lebih dari 30 masalah; arahan perbaikan bug, fitur baru, & k keuntungan di Menggarisbawahi v1.4.x+.
Selain itu setidaknya ada 3 Backbone boilerplates yang mencakup Lo-Dash secara default dan Lo-Dash sekarang disebutkan di Punggung resmi dokumentasi.
Check out Kit Cambridge's post, Mengatakan "Hello" Lo-Dash, untuk lebih dalam pemecahan pada perbedaan antara Lo-Dash dan Garis bawah.
Catatan kaki:
argumen
benda-benda. Di browser yang lebih baru, Menggarisbawahi metode mengabaikan lubang dalam array, "Benda" metode iterate argumen
objek, string diperlakukan sebagai array-seperti, dan metode dengan benar beralih fungsi (mengabaikan mereka "prototipe" properti) dan benda (iterasi dibayangi sifat seperti "toString" dan "valueOf"), sementara di browser lama mereka tidak akan. Juga, Menggarisbawahi metode seperti _.clone
melestarikan lubang dalam array, sementara yang lain seperti _.ratakan
don't.Lo-Dash ini terinspirasi oleh garis bawah, tapi saat ini adalah solusi yang unggul. Anda dapat membuat anda membangun kustom, memiliki kinerja yang lebih tinggi, dukungan AMD dan memiliki fitur tambahan yang besar. Check this Lo-Dash vs Menggarisbawahi benchmark pada jsperf dan.. ini posting mengagumkan tentang lo-dash:
Salah satu fitur yang paling berguna ketika anda bekerja dengan koleksi, adalah singkatan 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 }]
(diambil dari lodash docs)
Jika seperti saya anda mengharapkan sebuah daftar dari penggunaan perbedaan antara garis bawah dan lodash, ada's panduan untuk migrasi dari garis bawah untuk lodash.
Berikut ini's keadaan saat itu untuk anak cucu:
- Underscore
_.setiap
adalah Lodash_.beberapa
- Underscore
_.semua
adalah Lodash_.setiap
- Underscore
_.menulis
adalah Lodash_.flowRight
- Underscore
_.berisi
adalah Lodash_.termasuk
- Underscore
_.masing-masing
tidak memungkinkan keluar dengan kembalipalsu
- Underscore
_.findWhere
adalah Lodash_.menemukan
- Underscore
_.ratakan
lebih mendalam secara default saat Lodash dangkal- Underscore
_.groupBy
mendukung iteratee yang dilewatkan dengan parameter(nilai, indeks, originalArray)
, sementara di Lodash, yang iteratee untuk_.groupBy
hanya melewati satu parameter:(nilai)
.- Underscore
_.indexOf
dengan 3 parameterundefined
adalah Lodash_.indexOf
- Underscore
_.indexOf
dengan 3 parameterbenar
adalah Lodash_.sortedIndexOf
- Underscore
_.indexBy
adalah Lodash_.keyBy
- Underscore
_.memanggil
adalah Lodash_.invokeMap
- Underscore
_.mapObject
adalah Lodash_.mapValues
- Underscore
_.max
menggabungkan Lodash_.max
&_.maxBy
- Underscore
_.min
menggabungkan Lodash_.min
&_.minBy
- Underscore
_.sampel
menggabungkan Lodash_.sampel
&_.sampleSize
- Underscore
_.objek
menggabungkan Lodash_.fromPairs
dan_.zipObject
- Underscore
_.menghilangkan
dengan predikat Lodash_.omitBy
- Underscore
_.pasangan
adalah Lodash_.toPairs
- Underscore
_.memilih
dengan predikat Lodash_.pickBy
- Underscore
_.memetik
adalah Lodash_.peta
- Underscore
_.sortedIndex
menggabungkan Lodash_.sortedIndex
&_.sortedIndexOf
- Underscore
_.uniq
olehiteratee
adalah Lodash_.uniqBy
- Underscore
_.di mana
adalah Lodash_.filter
- Underscore
_.isFinite
tidak menyelaraskan denganNomor.isFinite
(misalnya,_.isFinite('1')
mengembalikantrue
di Garis bawah tapipalsu
di Lodash)- Underscore
_.pertandingan
singkatan yang tidak mendukung dalam perbandingan
(misalnya,_.filter(benda, { 'a': { 'b': 'c' } })
)- Menggarisbawahi ≥ 1.7 & Lodash
_.template
sintaks_.template(string, pilihan)(data)
- Lodash
_.memoize
cachePeta
seperti benda-benda- Lodash tidak mendukung
konteks
argumen untuk banyak metode dalam mendukung_.mengikat
- Lodash mendukung implisit chaining, malas chaining, & shortcut fusion
- Lodash membagi kelebihan beban
_.kepala
,_.lalu
,_.sisanya
, &_.awal
ke
_.mengambil
,_.takeRight
,_.drop
, &_.dropRight
(yaitu_.kepala(array, 2)
di Garis bawah adalah_.mengambil(array, 2)
di Lodash)
Selain John's jawaban, dan membaca di lodash (yang saya sampai sekarang dianggap sebagai "saya-terlalu" untuk underscore), dan melihat kinerja tes, membaca kode sumber, dan blog, beberapa poin yang membuat lodash jauh lebih unggul garis bawah ini:
Jika anda melihat ke menggarisbawahi's source-code, anda'akan melihat dalam beberapa baris pertama yang menggarisbawahi jatuh kembali pada asli implementasi dari banyak fungsi. Meskipun dalam dunia yang ideal, ini akan menjadi pendekatan yang lebih baik, jika anda melihat beberapa dari k link-link yang diberikan di slide ini, hal ini tidak sulit untuk menarik kesimpulan bahwa kualitas mereka 'asli implementasi' bervariasi banyak browser-untuk-browser. Firefox sangat cepat dalam beberapa fungsi, dan dalam beberapa Chrome mendominasi. (Saya membayangkan akan ada beberapa skenario di mana IE akan mendominasi juga). Saya percaya bahwa itu's lebih baik untuk memilih kode yang kinerja lebih konsisten di seluruh browser.
Jangan membaca posting blog sebelumnya, dan bukannya percaya itu untuk kepentingan nya, hakim untuk diri sendiri dengan menjalankan benchmark. Saya tertegun sekarang, melihat lodash melakukan 100-150% lebih cepat dari garis bawah, bahkan sederhana, asli fungsi seperti
Array.setiap
di Chrome!
Berikut ini adalah daftar perbedaan antara lodash, dan's menggarisbawahi-membangun adalah pengganti drop-in untuk menggarisbawahi proyek.
Ini adalah tahun 2014 dan beberapa tahun yang terlambat. Masih saya pikir saya memegang:
IMHO diskusi ini mendapat meledak di luar proporsi cukup sedikit. Mengutip tersebut blog post:
Paling JavaScript utilitas perpustakaan, seperti Menggarisbawahi, Valentine, dan wu, bergantung pada "asli-ganda pertama pendekatan." Pendekatan ini lebih suka asli implementasi, jatuh kembali ke vanili JavaScript hanya jika asli setara tidak didukung. Tapi jsPerf mengungkapkan yang menarik trend: cara yang paling efisien untuk iterate atas sebuah array atau array-suka koleksi adalah untuk menghindari asli implementasi sepenuhnya, memilih untuk loop sederhana bukan.
Seakan "loop sederhana" dan "vanili Javascript" lebih asli dari Array atau Obyek metode implementasi. Astaga ...
Itu pasti akan menyenangkan untuk memiliki satu sumber kebenaran, tapi ada isn't. Bahkan jika anda've telah mengatakan jika tidak, tidak ada Vanilla Allah, sayang. I'm maaf. Satu-satunya asumsi yang benar-benar memegang adalah bahwa kita semua adalah menulis kode Javascript yang bertujuan untuk melakukan dengan baik di semua browser utama, mengetahui bahwa semua dari mereka memiliki implementasi yang berbeda dari hal yang sama. It's menyebalkan untuk mengatasi, untuk membuatnya lebih ringan. Tapi yang's premis, apakah anda suka atau tidak.
Mungkin y'semua bekerja pada proyek-proyek skala besar yang membutuhkan twitterish kinerja sehingga anda benar-benar melihat perbedaan antara 850,000 (underscore) vs 2,500,000 (lodash) iterasi atas daftar per detik sekarang!
Saya adalah orang yang tidak. Maksud saya, saya bekerja di proyek-proyek di mana saya harus mengatasi masalah kinerja, tetapi mereka tidak pernah diselesaikan atau disebabkan oleh tidak Garis bawah atau Lo-Dash. Dan jika aku tidak mendapatkan perbedaan yang nyata dalam pelaksanaan dan kinerja (kita're berbicara C++ sekarang) dari katakanlah sebuah lingkaran di atas iterable (object atau array, jarang atau tidak!), Saya agak don't mendapatkan terganggu dengan klaim berdasarkan hasil benchmark platform yang sudah berpendirian.
Ini hanya membutuhkan satu update katakanlah Badak untuk mengatur berbagai metode implementasi api dalam mode yang tidak tunggal "abad pertengahan loop metode tampil lebih baik dan selamanya dan yang lainnya" imam bisa berdebat/nya jalan di sekitar fakta sederhana bahwa semua tiba-tiba sejumlah metode di FF jauh lebih cepat dari/nya berpendirian brainfuck. Pria, anda hanya dapat't menipu anda runtime environment dengan kecurangan anda runtime environment! Berpikir tentang hal itu ketika mempromosikan ...
anda utility belt
... waktu berikutnya.
Sehingga untuk tetap relevan:
Memilih pendekatan apa pun yang sesuai dengan kebutuhan anda yang paling. Seperti biasa. I'd sukai fallbacks aktual implementasi atas berpendirian runtime cheats kapan saja tetapi bahkan yang tampaknya menjadi masalah selera saat ini. Menempel kualitas sumber daya seperti http://developer.mozilla.com dan http://caniuse.com dan anda'akan baik-baik saja.
I'm setuju dengan sebagian besar hal-hal yang dikatakan di sini tapi saya hanya ingin menunjukkan argumen yang mendukung underscore.js: ukuran perpustakaan.
Khusus dalam kasus anda mengembangkan sebuah aplikasi atau website yang berniat untuk menggunakan sebagian besar pada perangkat mobile, ukuran bundel yang dihasilkan dan efek pada boot atau men-download waktu mungkin memiliki peran penting.
Sebagai perbandingan, ukuran ini adalah orang-orang yang saya perhatikan dengan sumber-peta-explorer setelah menjalankan ionic melayani:
lodash: 523kB
underscore.js: 51.6kb
Tidak yakin jika itu adalah apa yang OP berarti, tapi saya datang seberang pertanyaan ini karena saya sedang mencari sebuah daftar masalah yang saya miliki untuk menjaga dalam pikiran ketika melakukan migrasi dari garis bawah untuk lodash.
Saya akan sangat menghargai jika seseorang memposting artikel dengan daftar lengkap dari perbedaan-perbedaan tersebut. Mari saya mulai dengan hal-hal yang saya've belajar dengan cara yang keras (yaitu, hal-hal yang membuat saya kode meledak di produksi:/) :
_.ratakan
di garis bawah adalah mendalam secara default dan anda harus lulus benar sebagai argumen kedua untuk membuatnya dangkal. Di lodash itu dangkal secara default dan melewati sejati sebagai argumen kedua akan membuatnya jauh! :)_.lalu
di menggarisbawahi menerima argumen kedua yang memberitahu berapa banyak elemen yang anda inginkan. Di lodash
tidak ada pilihan tersebut. Anda bisa meniru ini dengan .slice
_.pertama
(masalah yang sama)_.template
di garis bawah dapat digunakan dalam banyak cara, salah satu yang menyediakan template string dan data dan mendapatkan HTML
kembali (atau setidaknya yang's bagaimana cara kerjanya beberapa waktu yang lalu). Di lodash
anda menerima fungsi yang harus anda kemudian makan dengan data._(sesuatu).peta(foo)
bekerja di garis bawah, tapi di lodash aku harus menulis ulang untuk _.peta(sesuatu,foo)
. Mungkin itu hanya Naskah
-masalahhttp://benmccormick.org/2014/11/12/underscore-vs-lodash/
Artikel terbaru membandingkan dua oleh Ben McCormick:
- Lo-Dash's API adalah superset dari Garis's.
- Di bawah kap [Lo-Dash] telah benar-benar ditulis ulang.
- Lo-Dash pasti tidak lebih lambat dari Garis bawah.
- Apa yang telah Lo-Dash menambahkan?
- Perbaikan Kegunaan
- Fungsi Tambahan
- Keuntungan Kinerja
- Singkatan sintaks untuk chaining
- Membangun Kustom untuk hanya menggunakan apa yang anda butuhkan
- Semantic versioning dan 100% cakupan kode
Saya hanya menemukan satu perbedaan yang akhirnya menjadi penting bagi saya. Non-garis bawah-versi yang kompatibel dari lodash's _.memperpanjang ()
tidak copy di atas tingkat-kelas-defined properties atau metode.
I've menciptakan Melati tes di CoffeeScript yang menunjukkan hal ini:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
Untungnya, lodash.underscore.js
mempertahankan Menggarisbawahi's perilaku menyalin segala sesuatu, yang untuk situasi saya adalah perilaku yang diinginkan.
Untuk sebagian besar garis bawah adalah subset dari lodash. Di kali, seperti saat ini menggarisbawahi akan memiliki sedikit fungsi lodash doesn't memiliki seperti mapObject. Yang satu ini menyelamatkan saya banyak waktu dalam pengembangan proyek saya.
Mereka cukup mirip dengan Lodash mengambil alih...
Mereka berdua adalah utilitas perpustakaan yang mengambil dunia dari utilitas di JavaScript...
Tampaknya Lodash semakin diperbarui lebih teratur sekarang, sehingga lebih banyak digunakan dalam proyek-proyek terbaru...
Juga Lodash tampaknya lebih ringan oleh beberapa KBs...
Keduanya memiliki api dan dokter, tapi saya pikir Lodash satu lebih baik...
Berikut adalah screenshot untuk masing-masing dokumen untuk mendapatkan nilai pertama dari array...
menggarisbawahi:
Seperti hal-hal yang mungkin akan mendapatkan update waktu ke waktu, hanya memeriksa situs web mereka juga...