Pertanyaan Perbedaan antara pengalihan dan underscore


Mengapa seseorang lebih memilih salah satunya lodash.js atau underscore.js perpustakaan utilitas di atas yang lain?

Lodash tampaknya menjadi pengganti drop-in untuk garis bawah, yang terakhir telah ada lebih lama.

Saya pikir keduanya brilian, tetapi saya tidak cukup tahu tentang bagaimana mereka bekerja untuk membuat perbandingan terpelajar, dan saya ingin tahu lebih banyak tentang perbedaan.


1400
2017-12-09 17:08


asal


Jawaban:


Saya membuat Lo-Dash untuk memberikan dukungan pengulangan lintas-lingkungan yang lebih konsisten untuk array, string, objek, dan arguments objek1. Sejak itu menjadi superset Underscore, menyediakan perilaku API yang lebih konsisten, lebih banyak fitur (seperti dukungan AMD, deep clone, dan deep merge), lebih teliti dokumentasi dan tes unit (tes yang berjalan di Node, Ringo, Rhino, Narwhal, PhantomJS, dan browser), kinerja keseluruhan yang lebih baik dan optimalisasi untuk iterasi array / objek besar, dan lebih banyak fleksibilitas dengan bangunan khusus dan utilitas pra-kompilasi template.

Karena Lo-Dash diperbarui lebih sering daripada Underscore, a lodash underscore membangun disediakan untuk memastikan kompatibilitas dengan versi stabil terbaru Underscore.

Pada satu titik saya bahkan diberikan akses push untuk Menggarisbawahi, sebagian karena Lo-Dash bertanggung jawab untuk mengangkat lebih dari 30 masalah; perbaikan bug pendaratan, fitur baru, & peningkatan perf dalam Underscore v1.4.x +.

Selain itu, setidaknya ada 3 Backbone boilerplate yang menyertakan Lo-Dash secara default dan Lo-Dash sekarang disebutkan dalam daftar resmi Backbone dokumentasi.

Lihat posting Kit Cambridge, Ucapkan "Halo" ke Lo-Dash, untuk rincian lebih dalam pada perbedaan antara Lo-Dash dan Underscore.

Catatan Kaki:

  1. Underscore memiliki dukungan yang tidak konsisten untuk array, string, objek, dan arguments objek. Di browser yang lebih baru, metode Underscore mengabaikan lubang di array, "Objek" metode iterate arguments objek, string diperlakukan sebagai array-like, dan metode-fungsi iterate dengan benar (mengabaikan properti "prototipe" mereka) dan objek (mengiterasi properti bayangan seperti "toString" dan "valueOf"), sementara di browser yang lebih lama mereka tidak. Juga, metode Underscore seperti _.clone melestarikan lubang dalam array, sementara yang lain suka _.flatten tidak.

1777
2017-12-16 05:34



Lo-Dash terinspirasi oleh garis bawah, tetapi saat ini adalah solusi yang unggul. Anda bisa membuatnya bangunan khusus, punya a kinerja yang lebih tinggi, dukung AMD dan miliki fitur ekstra hebat. Periksa ini Lo-Dash vs Underscore benchmarks pada jsperf dan .. ini posting mengagumkan tentang lo-dash:

Salah satu fitur yang paling berguna ketika Anda bekerja dengan koleksi, adalah sintaks singkatan:

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 dokumen lodash)


165
2017-12-13 21:51



Selain jawaban John, dan membaca tentang lodash (yang selama ini saya anggap sebagai "saya juga" untuk menggarisbawahi), dan melihat tes kinerja, membaca kode sumber, dan posting blog, beberapa poin yang membuat undian lebih unggul daripada garis bawah adalah ini:

  1. Ini bukan tentang kecepatan, seperti itu konsistensi kecepatan (?)

    Jika Anda melihat ke dalam kode sumber underscore, Anda akan melihat di beberapa baris pertama yang menegaskan kembali pada implementasi asli dari banyak fungsi. Meskipun di dunia yang ideal, ini akan menjadi pendekatan yang lebih baik, jika Anda melihat beberapa tautan penting yang diberikan slide ini, tidak sulit untuk menarik kesimpulan bahwa kualitas dari 'implementasi asli' itu mengubah banyak browser-ke-browser. Firefox sangat cepat di beberapa fungsi, dan di beberapa Chrome mendominasi. (Saya membayangkan akan ada beberapa skenario di mana IE akan mendominasi juga). Saya percaya bahwa lebih baik memilih kode yang kinerja lebih konsisten di semua browser.

    Jangan membaca posting blog sebelumnya, dan alih-alih mempercayai itu demi, menilai sendiri dengan menjalankan tolok ukur. Saya tercengang saat ini, melihat perilaku melakukan 100-150% lebih cepat daripada menggarisbawahi bahkan sederhana, asli fungsi seperti Array.every di Chrome!

  2. Itu ekstra di lodash juga cukup berguna.

  3. Adapun komentar Xananax yang sangat tinggi yang menyarankan kontribusi untuk menggarisbawahi kode: Itu selalu lebih baik untuk dimiliki BAIK persaingan, tidak hanya membuat inovasi tetap berjalan, tetapi juga mendorong Anda untuk menjaga diri (atau perpustakaan Anda) dalam kondisi yang baik.

Ini dia daftar perbedaan antara lodash, dan underscore-build adalah pengganti drop-in untuk proyek underscore Anda.


57
2017-08-18 14:18



Jika seperti saya, Anda mengharapkan daftar perbedaan penggunaan antara underscore dan lodash, ada a panduan untuk bermigrasi dari underscore menjadi lodash.

Inilah keadaan saat ini untuk anak cucu:

  • Menggarisbawahi _.compose adalah Lodash _.flowRight
  • Menggarisbawahi _.contains adalah Lodash _.includes
  • Menggarisbawahi _.findWhere adalah Lodash _.find
  • Menggarisbawahi _.invoke adalah Lodash _.invokeMap
  • Menggarisbawahi _.mapObject adalah Lodash _.mapValues
  • Menggarisbawahi _.pluck adalah Lodash _.map
  • Menggarisbawahi _.where adalah Lodash _.filter
  • Menggarisbawahi _.any adalah Lodash _.some
  • Menggarisbawahi _.all adalah Lodash _.every
  • Menggarisbawahi _.each tidak memungkinkan keluar dengan kembali false
  • Menggarisbawahi _.flatten dalam dengan default, sedangkan Lodash dangkal
  • Menggarisbawahi _.isFinite tidak sejajar Number.isFinite
       (misalnya. _.isFinite('1') kembali true di Underscore tapi false di   Lodash)
  • Menggarisbawahi _.matches singkatan tidak mendukung perbandingan mendalam
       (misalnya. _.filter(objects, { 'a': { 'b': 'c' } }))
  • Underscore ≥ 1.7 & Lodash telah berubah _.template sintaks ke
    _.template(string, option)(data)
  • Lodash _.uniq tidak menerima iteratee berfungsi seperti Underscore. Gunakan Lodash _.uniqBy
  • Lodash _.first dan ._last jangan menerima n Argumen seperti Underscore. Menggunakan slice
  • Lodash _.memoize cache adalah Map seperti benda
  • Lodash mendukung chaining implisit, rantai malas, & jalan pintas   fusi
  • Lodash membagi kelebihannya _.head, _.last, _.rest, & _.initial keluar
      _.take, _.takeRight, _.drop, &    _.dropRight
       (yaitu. _.head(array, 2) di Underscore adalah    _.take(array, 2) di Lodash)

55
2017-07-21 09:35



Ini adalah tahun 2014 dan beberapa tahun terlambat. Masih saya pikir poin saya memegang:

IMHO diskusi ini meledak di luar proporsi cukup sedikit. Mengutip yang disebutkan di atas posting blog:

Sebagian besar pustaka utilitas JavaScript, seperti Underscore, Valentine, dan   wu, bergantung pada "pendekatan dual asli pertama." Pendekatan ini lebih suka   implementasi asli, jatuh kembali ke JavaScript vanila hanya jika   Setara asli tidak didukung. Tapi jsPerf mengungkapkan hal yang menarik   trend: cara yang paling efisien untuk melakukan iterasi melalui array atau array-like   koleksi adalah untuk menghindari implementasi asli sepenuhnya, memilih untuk   loop sederhana sebagai gantinya.

Seakan-akan "loop sederhana" dan "vanilla Javascript" lebih asli daripada Array atau implementasi metode Object. Astaga ...

Tentunya akan menyenangkan untuk memiliki satu sumber kebenaran, tetapi tidak ada. Bahkan jika Anda telah diberitahu sebaliknya, tidak ada Tuhan Vanilla, sayangku. Maafkan saya. Satu-satunya asumsi yang benar-benar berlaku adalah bahwa kita semua menulis kode Javascript yang bertujuan berkinerja baik di semua browser utama, mengetahui bahwa semuanya memiliki implementasi yang berbeda dari hal yang sama. Ini jalang untuk mengatasinya, secara halus. Tapi itulah premisnya, suka atau tidak suka.

Mungkin kalian sedang mengerjakan proyek berskala besar yang membutuhkan kinerja berkesan sehingga Anda benar-benar melihat perbedaannya antara 850.000 (underscore) vs. 2.500.000 (lodash) iterasi pada daftar per detik sekarang juga!

Saya untuk satu tidak. Maksud saya, saya bekerja proyek di mana saya harus mengatasi masalah kinerja, tetapi mereka tidak pernah dipecahkan atau disebabkan oleh Underscore atau Lo-Dash. Dan kecuali saya mendapatkan perbedaan nyata dalam implementasi dan kinerja (kita berbicara C ++ sekarang) dari katakanlah sebuah loop melalui iterable (objek atau array, jarang atau tidak!), Saya lebih suka tidak terganggu dengan klaim berdasarkan hasil dari platform benchmark itu sudah berpendirian.

Hanya perlu satu pembaruan saja, katakanlah Rhino untuk mengatur penerapan metode Array-nya dengan api dalam mode yang tidak satu pun "metode lingkaran abad pertengahan berkinerja lebih baik dan selamanya dan yang lainnya" pendeta dapat membantah dengan cara nya di sekitar fakta sederhana bahwa semua metode array tiba-tiba dalam FF jauh lebih cepat daripada brainfuck pendapatnya. Man, Anda tidak bisa menipu lingkungan runtime Anda dengan menipu lingkungan runtime Anda! Pikirkan itu ketika mempromosikan ...

sabuk utilitas Anda

... lain kali.

Jadi untuk membuatnya tetap relevan:

  • Gunakan Underscore jika Anda menyukai tanpa mengorbankan ish asli.
  • Gunakan Lo-Dash jika Anda merasa nyaman dan menyukai katalog fitur yang diperluas (salinan dalam dll.) Dan jika Anda sangat membutuhkan kinerja instan dan yang paling penting tidak keberatan memilih alternatif segera setelah API asli lebih cemerlang pekerjaan yang didalilkan. Yang akan segera terjadi. Periode.
  • Bahkan ada solusi ketiga. DIY! Ketahuilah lingkungan Anda. Ketahui tentang ketidakkonsistenan. Baca mereka (John-Daviddan Jeremykode). Jangan gunakan ini atau itu tanpa bisa menjelaskan mengapa lapisan konsistensi / kompatibilitas benar-benar diperlukan dan meningkatkan alur kerja Anda atau meningkatkan kinerja aplikasi Anda. Sangat mungkin bahwa persyaratan Anda dipenuhi dengan polyfill sederhana yang dapat Anda tulis sendiri. Kedua perpustakaan itu hanyalah vanila biasa dengan sedikit gula. Mereka berdua hanya berebut siapa yang menyajikan kue termanis. Tapi percayalah, pada akhirnya keduanya hanya memasak dengan air. Tidak ada Dewa Vanilla sehingga tidak mungkin ada Paus Vanilla, bukan?

Pilih pendekatan apa pun yang paling sesuai dengan kebutuhan Anda. Seperti biasa. Saya lebih suka fallbacks pada implementasi aktual atas kecurangan runtime yang berdebat kapan saja tetapi bahkan yang tampaknya menjadi masalah selera saat ini. Tetap berpegang pada sumber daya berkualitas seperti http://developer.mozilla.com dan http://caniuse.com dan kamu akan baik-baik saja.


43
2017-09-11 21:27



Saya setuju dengan sebagian besar hal yang dikatakan di sini tapi saya hanya ingin menunjukkan argumen yang mendukung underscore.js: ukuran perpustakaan.

Khususnya jika Anda mengembangkan aplikasi atau situs web yang ingin digunakan sebagian besar pada perangkat seluler, ukuran bundel yang dihasilkan dan efeknya pada boot atau waktu pengunduhan mungkin memiliki peran penting.

Sebagai perbandingan, ukuran ini adalah yang saya perhatikan dengan penjelajah kode sumber setelah menjalankan servis ionik:

lodash: 523kB
underscore.js: 51.6kb

14
2018-04-26 14:20



Tidak yakin apakah itu yang dimaksud OP, tetapi saya menemukan pertanyaan ini karena saya sedang mencari daftar masalah yang harus saya ingat ketika bermigrasi dari underscore menjadi lodash.

Saya akan sangat menghargai jika seseorang memposting artikel dengan daftar lengkap dari perbedaan tersebut. Mari saya mulai dengan hal-hal yang telah saya pelajari dengan cara yang sulit (yaitu, hal-hal yang membuat kode saya meledak pada produksi: /):

  • _.flatten dalam underscore adalah deep secara default dan Anda harus benar sebagai argumen kedua untuk membuatnya dangkal. Dalam undian itu dangkal secara default dan benar sebagai argumen kedua akan membuatnya mendalam! :)
  • _.last dalam garis bawah menerima argumen kedua yang memberi tahu berapa banyak elemen yang Anda inginkan. Di lodash tidak ada opsi seperti itu. Anda dapat meniru ini dengan .slice
  • _.first (masalah yang sama)
  • _.template dalam garis bawah dapat digunakan dalam banyak cara, salah satunya adalah menyediakan string dan data template dan mendapatkan HTML kembali (atau setidaknya itulah cara kerjanya beberapa waktu lalu). Di lodash Anda menerima fungsi yang kemudian harus Anda beri makan dengan data.
  • _(something).map(foo) bekerja dalam garis bawah, tetapi dalam lodash saya harus menulis ulang _.map(something,foo). Mungkin itu hanya a TypeScript-isu

9
2018-03-25 12:16



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

Artikel terbaru membandingkan keduanya oleh Ben McCormick:

  1. API Lo-Dash adalah superset dari Underscore.

  2. Di bawah tenda [Lo-Dash] telah benar-benar ditulis ulang.

  3. Lo-Dash jelas tidak lebih lambat dari Underscore.

  4. Apa yang telah ditambahkan Lo-Dash?

    • Usability Improvements
    • Fungsionalitas Ekstra
    • Keuntungan Performa
    • Sintaksis singkatan untuk chaining
    • Custom Builds hanya menggunakan apa yang Anda butuhkan
    • Versi semantik dan cakupan kode 100%

8
2017-12-07 12:19