ความแตกต่างระหว่าง Lodash และขีดล่าง [ปิด]


1602

ทำไมบางคนถึงเลือกชอบโปรแกรมอรรถประโยชน์lodash.jsหรือunderscore.jsมากกว่าอีกอันหนึ่ง?

Lodash ดูเหมือนจะเป็นแบบดรอปอินสำหรับขีดล่าง

ฉันคิดว่าทั้งคู่นั้นยอดเยี่ยม แต่ฉันไม่รู้มากพอเกี่ยวกับวิธีการทำงานเพื่อเปรียบเทียบการศึกษาและฉันต้องการทราบเพิ่มเติมเกี่ยวกับความแตกต่าง


2
คุณอาจต้องการที่จะดูบางส่วนของหน้าจอที่เกี่ยวกับ Lodash ที่เชื่อมโยงกับในหน้า GitHub โดยส่วนตัวฉันใช้ underscore.js แต่มากกว่านั้นเพราะนั่นคือสิ่งที่ฉันเริ่มต้นด้วยและเมื่อคุณบอกว่ามันใช้เวลานานกว่านั้น
แจ็ค

26
lodashและunderscoreอยู่ภายใต้การรวมเธรดตอนนี้
zangw

คำตอบ:


2023

ฉันสร้าง Lo-Dash เพื่อให้การสนับสนุนการทำซ้ำข้ามสภาพแวดล้อมที่สอดคล้องกันมากขึ้นสำหรับอาร์เรย์สตริงวัตถุและargumentsวัตถุ1 มันได้กลายมาเป็นชุดย่อยของ Underscore ที่ให้พฤติกรรม API ที่สอดคล้องกันมากขึ้นมีคุณสมบัติมากขึ้น(เช่นการสนับสนุนของ AMD, การโคลนนิ่งที่ลึกและการรวมที่ลึก), การทดสอบเอกสารและหน่วยทดสอบอย่างละเอียดมากขึ้น(การทดสอบที่ทำงานใน Node, Ringo และเบราว์เซอร์) ประสิทธิภาพโดยรวมที่ดีขึ้นและการเพิ่มประสิทธิภาพสำหรับการทำซ้ำอาร์เรย์ / วัตถุขนาดใหญ่และความยืดหยุ่นที่มากขึ้นด้วยการสร้างที่กำหนดเองและยูทิลิตี้การรวบรวมล่วงหน้าเทมเพลต

เพราะ Lo-Dash มีการปรับปรุงบ่อยมากกว่าเน้นการlodash underscoreสร้างให้ไว้เพื่อให้เข้ากันกับรุ่นเสถียรล่าสุดเน้น

จนถึงจุดหนึ่งฉันยังได้รับการเข้าถึงการกดเพื่อขีดเส้นใต้ส่วนหนึ่งเป็นเพราะ Lo-Dash รับผิดชอบในการเพิ่มปัญหามากกว่า 30 ประเด็น แก้ไขข้อผิดพลาดการเชื่อมโยงไปถึงคุณสมบัติใหม่ & รับประโยชน์ใน Underscore v1.4.x +

นอกจากนี้ยังมีอย่างน้อย 3 boilerplates Backbone ที่มี Lo-Dash โดยค่าเริ่มต้นและ Lo-Dash เป็นที่กล่าวถึงในตอนนี้อย่างเป็นทางการ Backbone ของเอกสาร

ลองดูโพสต์ของ Kit Cambridge พูดว่า "Hello" ถึง Lo-Dashเพื่อดูรายละเอียดเกี่ยวกับความแตกต่างระหว่าง Lo-Dash และ Underscore

เชิงอรรถ:

  1. ขีดล่างมีการสนับสนุนที่ไม่สอดคล้องกันสำหรับอาร์เรย์สตริงวัตถุและargumentsวัตถุ ในเบราว์เซอร์ที่ใหม่กว่าวิธีการขีดเส้นใต้จะไม่สนใจช่องโหว่ในอาร์เรย์วิธีการ "วัตถุ" ทำซ้ำargumentsวัตถุสตริงจะถือว่าเป็นอาร์เรย์เหมือนและวิธีการอย่างถูกต้องซ้ำฟังก์ชั่น (ละเว้นคุณสมบัติ "ต้นแบบ") และวัตถุ (ซ้ำคุณสมบัติเงาเช่น "toString" และ "valueOf") ในขณะที่เบราว์เซอร์รุ่นเก่าจะไม่มี นอกจากนี้วิธีการขีดล่างเช่น_.cloneรักษาหลุมในอาร์เรย์ในขณะที่คนอื่น_.flattenไม่ชอบ

174
@Brian - ในขณะที่การพัฒนา Lo-Dash ฉันยังคงถามคำถาม "สิ่งที่บางคนอาจชี้ไปใน Lo-Dash เป็นเชิงลบเมื่อเทียบกับขีดล่าง?" แล้วพูดกับพวกเขา นี่คือเหตุผลที่ฉันได้เตรียมเอกสารประกอบเพิ่มงานสร้างที่กำหนดเองและทำให้แหล่งข้อมูลอ่านได้ง่ายขึ้น
John-David Dalton

10
ฉันถูกล่อลวงให้โพสต์เกณฑ์มาตรฐานบางอย่าง แต่นั่นอาจกลายเป็นเรื่องน่าเบื่อ พอจะพูดได้ว่าทุกมาตรฐานผมเคยทำงานได้พิสูจน์ Lo-Dash จะเร็ว ( มากได้เร็วขึ้นในหลายกรณี) กว่าขีดล่าง
Wil Moore III

186
ฉันชอบแท้จริงและฉันใช้มันดังนั้นโปรดอย่าคิดว่าฉันทุบตี แต่ทำไมไม่สนับสนุนขีดล่างแทนการสร้างห้องสมุดใหม่
Xananax

133
@Xananax - ตรวจสอบกระทู้ความคิดเห็น: github.com/jashkenas/underscore/commit/… - นี่อาจตอบคำถามนั้นได้
Rob Grant

41
มีความพยายามใด ๆ ที่จะผสานบ้านพักกลับเข้าสู่ขีดเส้นใต้หรือไม่?
ไฟถนน

186

Lo-Dash ได้รับแรงบันดาลใจจากการขีดเส้นใต้ แต่ปัจจุบันเป็นทางออกที่เหนือกว่า คุณสามารถทำให้คุณกำหนดเองสร้างมีประสิทธิภาพการทำงานที่สูงขึ้น , สนับสนุน AMD และมีคุณสมบัติพิเศษที่ดี ตรวจสอบLo-Dash vs Underscore benchmarksบน jsperf และ .. โพสต์ที่ยอดเยี่ยมเกี่ยวกับ lo-dash :

หนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดเมื่อคุณทำงานกับคอลเลกชันคือไวยากรณ์ชวเลข:

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 )


1
ลิงก์ไปยังบล็อกของ Kit Cambridge นั้นมีข้อมูลมาก
Brian M. Hunt

ฉันคิดว่านี่เป็นสิ่งที่ผิด (ตัวอย่างที่ถอนได้) ตั้งแต่อัพเดตล่าสุด 1.8.3 คุณสามารถใช้ถอนแบบเดียวกับ lodash ต่อไปสำหรับรุ่นก่อนหน้าฉันไม่คิดว่าขีดเส้นใต้จะเปิดเผยฟังก์ชั่นที่เหมือนกับแผนที่ (ตัวอย่างขีดล่างของคุณดูเหมือนว่าเป็นฟังก์ชั่นแผนที่)
alexserver

7
filterคุณลักษณะในการขีดเส้นใต้จาก 2012 github.com/jashkenas/underscore/issues/648 (ชื่อของมันคือwhere)
มูฮัมหมัด Hewedy

ฉันได้รับข้อผิดพลาด 500 ในลิงก์มาตรฐานขีด
ล่าง

86

ถ้าเช่นฉันคุณคาดหวังว่ารายการของความแตกต่างระหว่างการใช้งานและขีด lodash ที่มีคำแนะนำสำหรับการย้ายจากขีดเพื่อ lodash

นี่คือสถานะปัจจุบันของมันสำหรับลูกหลาน:

  • ขีด_.anyเส้นใต้คือ Lodash_.some
  • ขีด_.allเส้นใต้คือ Lodash_.every
  • ขีด_.composeเส้นใต้คือ Lodash_.flowRight
  • ขีด_.containsเส้นใต้คือ Lodash_.includes
  • ขีดเส้นใต้_.eachไม่อนุญาตให้ออกโดยกลับมาfalse
  • ขีด_.findWhereเส้นใต้คือ Lodash_.find
  • ขีดเส้น_.flattenใต้ลึกโดยค่าเริ่มต้นในขณะที่ Lodash ตื้น
  • ขีด_.groupByล่างสนับสนุนการวนซ้ำที่ส่งผ่านพารามิเตอร์(value, index, originalArray)ในขณะที่อยู่ใน Lodash การวนซ้ำสำหรับ_.groupByจะส่งผ่านพารามิเตอร์เดียว(value)เท่านั้น:
  • ขีดล่างที่มี_.indexOfพารามิเตอร์ที่ 3 undefinedคือ Lodash_.indexOf
  • ขีดล่างที่มี_.indexOfพารามิเตอร์ที่ 3 trueคือ Lodash_.sortedIndexOf
  • ขีด_.indexByเส้นใต้คือ Lodash_.keyBy
  • ขีด_.invokeเส้นใต้คือ Lodash_.invokeMap
  • ขีด_.mapObjectเส้นใต้คือ Lodash_.mapValues
  • ขีด_.maxล่างรวมกับ Lodash _.max&_.maxBy
  • ขีด_.minล่างรวมกับ Lodash _.min&_.minBy
  • ขีด_.sampleล่างรวมกับ Lodash _.sample&_.sampleSize
  • ขีด_.objectเส้นใต้รวม Lodash _.fromPairsและ_.zipObject
  • ขีดเส้น_.omitใต้โดยเพรดิเคตคือ Lodash_.omitBy
  • ขีด_.pairsเส้นใต้คือ Lodash_.toPairs
  • ขีดเส้น_.pickใต้โดยเพรดิเคตคือ Lodash_.pickBy
  • ขีด_.pluckเส้นใต้คือ Lodash_.map
  • ขีด_.sortedIndexล่างรวมกับ Lodash _.sortedIndex&_.sortedIndexOf
  • ขีดเส้น_.uniqใต้โดย a iterateeคือ Lodash_.uniqBy
  • ขีด_.whereเส้นใต้คือ Lodash_.filter
  • ขีดเส้นใต้_.isFiniteไม่ตรงกับNumber.isFinite
    (เช่น_.isFinite('1')ผลตอบแทนtrueในการขีดfalseล่างแต่ใน Lodash)
  • _.matchesชวเลขอันเดอร์ขีดล่างไม่สนับสนุนการเปรียบเทียบแบบลึก
    (เช่น_.filter(objects, { 'a': { 'b': 'c' } }))
  • ขีดล่าง≥ 1.7 และ_.templateไวยากรณ์ของLodash คือ
    _.template(string, option)(data)
  • _.memoizeแคชLodash เป็นMapเหมือนวัตถุ
  • Lodash ไม่สนับสนุนการcontextโต้เถียงสำหรับวิธีการต่างๆมากมาย_.bind
  • Lodash รองรับการเชื่อมโยงโดยนัย , การเชื่อมโยงแบบสันหลังยาว, & ฟิวชั่นทางลัด
  • Lodash แยกมันมากเกินไป_.head, _.last, _.restและ_.initialออกไป
    _.take, _.takeRight, _.dropและ_.dropRight
    (เช่น_.head(array, 2)ในเน้นคือ_.take(array, 2)ใน Lodash)

1
ฉันเจอปัญหาเหล่านี้ด้วยตัวเองเมื่อทำการย้ายและฉันยังคงรักษาเอกสารข้าม (WIP) ไว้ระหว่างหนึ่งกับอีกเอกสารหนึ่ง หวังว่ามันจะเป็นประโยชน์กับคนอื่นเช่นกัน!
luxon

60

นอกเหนือจากคำตอบของจอห์นและการอ่านบน lodash (ซึ่งฉันถือมาจนบัดนี้เป็น "ฉัน - เกินไป" เพื่อขีดเส้นใต้) และเห็นการทดสอบประสิทธิภาพการอ่านซอร์สโค้ดและโพสต์บล็อกไม่กี่จุดที่ทำให้ lodash ดีกว่ามากเพื่อขีดล่างเหล่านี้:

  1. มันไม่เกี่ยวกับความเร็วเนื่องจากมันเกี่ยวกับความสอดคล้องของความเร็ว (?)

    หากคุณดูซอร์สโค้ดของขีดล่างคุณจะเห็นในสองสามบรรทัดแรกที่ขีดเส้นใต้ขีดทับบนการประยุกต์ใช้ดั้งเดิมของฟังก์ชั่นมากมาย แม้ว่าในโลกในอุดมคตินี่จะเป็นวิธีที่ดีกว่าถ้าคุณดูลิงค์ที่มีอยู่ในสไลด์เหล่านี้มันไม่ยากที่จะสรุปได้ว่าคุณภาพของ 'การใช้งานดั้งเดิม' นั้นแตกต่างกันมากกับเบราว์เซอร์ การเบราว์เซอร์ Firefox มีการด่าอย่างรวดเร็วในฟังก์ชั่นบางอย่างและในบาง Chrome ก็มีอำนาจเหนือกว่า (ฉันคิดว่าจะมีบางสถานการณ์ที่ IE จะครอบงำด้วย) ฉันเชื่อว่าการเลือกรหัสที่มีประสิทธิภาพสอดคล้องกันในเบราว์เซอร์ดีกว่า

    จะอ่านบล็อกโพสต์ก่อนหน้านี้และแทนที่จะเชื่อว่ามันเพื่อประโยชน์ของผู้พิพากษาสำหรับตัวคุณเองโดยใช้มาตรฐาน ฉันกำลังตะลึงตอนนี้เห็น lodash ปฏิบัติ 100-150% เร็วกว่าขีดแม้ในที่เรียบง่าย , พื้นเมืองของฟังก์ชั่นเช่นArray.everyใน Chrome!

  2. ความพิเศษใน Lodash ก็มีประโยชน์มากเช่นกัน

  3. สำหรับความคิดเห็นที่เพิ่มขึ้นอย่างมากของ Xananax ที่บอกถึงการสนับสนุนโค้ดของขีดเส้นใต้: มันเป็นการดีกว่าเสมอที่จะมีการแข่งขันที่ดีไม่เพียง แต่จะทำให้นวัตกรรมเดินหน้าต่อไป แต่ยังผลักดันให้คุณรักษาตัวเอง

นี่คือรายการความแตกต่างระหว่าง Lodash และขีดล่าง - บิลด์เป็นแบบดรอปดาวน์สำหรับโครงการขีดล่างของคุณ


6
ในกรณีใดค่า "ความสอดคล้องของความเร็ว" เป็นค่า? สมมติว่าฉันมีวิธีที่มีความเร็ว 100% ใน FF และใน IE และการใช้งานแบบดั้งเดิมจะมีความเร็ว 80% ใน IE และ 120% ใน FF (หรืออีกวิธีหนึ่ง) จากนั้นฉันจะบอกว่ามันเป็นการดีที่จะใช้การติดตั้งแบบเนทีฟใน FF และการติดตั้งใช้งานใน IE ฉันไม่สามารถจินตนาการได้ว่ากรณีใดที่ฉันจะพูดว่า: ให้ช้าลง FF เพียงเพื่อเหตุผลที่มีความเร็วเช่นเดียวกับใน IE ขนาดของรหัสและการบำรุงรักษาหรือการชะลอตัวโดยเฉลี่ยในเบราว์เซอร์ทั้งหมดจะเป็นข้อโต้แย้ง แต่ความสอดคล้องของความเร็ว?
stofl

2
ฉันหมายถึง "ความเร็วที่เร็วกว่าอย่างสม่ำเสมอ"
kumarharsh

1
ขนาดแตกต่างกันอย่างไร สมมติว่าคุณสร้างบิลด์ที่กำหนดเองด้วย lodash ซึ่งมีฟังก์ชั่นเหมือนกับขีดล่างใช่ไหม มีความแตกต่างอย่างมากระหว่างพวกเขาเหรอ? ฉันเดาว่าการปรับปรุงใหม่จะเพิ่มน้ำหนักให้กับไซต์
F Lekschas

5
ฉันอยากจะย้อนกลับไปสู่การใช้งานดั้งเดิมของเบราว์เซอร์เพียงเพราะในกรณีส่วนใหญ่มีประสิทธิภาพที่ยอมรับได้และสามารถปรับปรุงด้วยการอัปเดตเบราว์เซอร์โดยไม่ต้องกังวลเพื่อให้ห้องสมุดทันสมัย
orad

3
@ KumarHarsh บางทีฉันอาจจะพูดไม่ดี ฉันหมายถึงฉันมีแนวโน้มที่จะใช้ห้องสมุดที่ใช้ฟังก์ชั่นพื้นฐานภายในถ้ามีอยู่แทนที่จะเลือกใช้มันเอง
orad

42

นี่คือปี 2014 และสองปีที่ผ่านมาสายเกินไป ยังฉันคิดว่าจุดของฉันถือ:

IMHO การสนทนานี้ได้ปลิวไปตามสัดส่วนค่อนข้างน้อย การโพสต์บล็อกโพสต์ดังกล่าว:

ไลบรารียูทิลิตี JavaScript ส่วนใหญ่เช่น Underscore, Valentine และ wu พึ่งพา "วิธีการสองวิธีแรก วิธีการนี้ต้องการการใช้งานแบบเนทีฟการย้อนกลับไปยังวานิลลา JavaScript เฉพาะในกรณีที่ไม่สนับสนุนการทำงานแบบเนทีฟ แต่ jsPerf เปิดเผยถึงแนวโน้มที่น่าสนใจ: วิธีที่มีประสิทธิภาพมากที่สุดในการวนซ้ำในคอลเลกชันของอาเรย์หรืออาเรย์ก็คือการหลีกเลี่ยงการใช้งานแบบดั้งเดิมทั้งหมดโดยเลือกใช้ลูปแบบง่ายแทน

ราวกับว่า "ลูปแบบง่าย" และ "วานิลลา Javascript" นั้นมีพื้นฐานมากกว่าการใช้วิธี Array หรือ Object Jeez ...

มันคงจะดีถ้ามีแหล่งความจริงแหล่งเดียว แต่ไม่มี แม้ว่าคุณจะได้รับการบอกเล่าเป็นอย่างอื่นไม่มีพระเจ้าวานิลลาที่รักของฉัน ฉันขอโทษ. ข้อสันนิษฐานเดียวที่ถือจริงๆคือเราทุกคนกำลังเขียนโค้ดจาวาสคริปต์ที่มุ่งหวังที่จะทำงานได้ดีในเบราว์เซอร์หลักทั้งหมดโดยรู้ว่าพวกเขาทั้งหมดมีการใช้งานที่แตกต่างกันในสิ่งเดียวกัน มันเป็นเรื่องเลวที่ต้องรับมือกับมันอย่างอ่อนโยน แต่นั่นคือหลักฐานไม่ว่าคุณจะชอบหรือไม่

บางทีคุณอาจกำลังทำงานในโครงการขนาดใหญ่ที่ต้องการประสิทธิภาพแบบ twitterish เพื่อให้คุณเห็นความแตกต่างระหว่างการทำซ้ำ 850,000 (ขีดล่าง) และการทำซ้ำ 2,500,000 (Lodash) มากกว่ารายการต่อวินาทีในขณะนี้!

ฉันคนเดียวไม่ได้ ฉันหมายถึงฉันทำงานโครงการที่ต้องจัดการกับปัญหาด้านประสิทธิภาพ แต่ก็ไม่เคยแก้ไขหรือเกิดจาก Underscore หรือ Lo-Dash และถ้าฉันไม่ได้รับความแตกต่างที่แท้จริงในการนำไปใช้และประสิทธิภาพ (ตอนนี้เรากำลังพูดถึง C ++ ตอนนี้) ให้ลองวนลูปที่ทำซ้ำได้ (วัตถุหรืออาร์เรย์เบาบางหรือไม่!) ฉันไม่รำคาญอะไรเลย อ้างว่าขึ้นอยู่กับผลของแพลตฟอร์มมาตรฐานที่จะดื้อดึงแล้ว

เพียงแค่ต้องการอัปเดตเดียวให้ Rhino ตั้งค่าการใช้วิธี Array บนไฟในแบบที่ไม่ใช่ "วิธีวนลูปยุคกลางที่ทำงานได้ดีขึ้นเรื่อย ๆ และตลอดไปและนักบวช" ไม่สามารถโต้แย้งวิธีของเขา / เธอรอบข้อเท็จจริงที่ว่า วิธีการเรียงลำดับแบบฉับพลันใน FF นั้นเร็วกว่าการแสดงความคิดเห็นทางสมองของเขา / เธอ ชายคุณไม่สามารถโกงสภาพแวดล้อมรันไทม์ของคุณได้โดยโกงสภาพแวดล้อมรันไทม์ของคุณ! คิดดูสิว่าเมื่อโปรโมต ...

สายพานยูทิลิตี้ของคุณ

... คราวหน้า.

ดังนั้นเพื่อให้มันมีความเกี่ยวข้อง:

  • ใช้ขีดเส้นใต้หากคุณสะดวกโดยไม่ต้องเสียสละภาษาพื้นเมือง
  • ใช้ Lo-Dash หากคุณต้องการความสะดวกสบายและชอบแคตตาล็อกฟีเจอร์เสริม (สำเนาลึกและอื่น ๆ ) และหากคุณต้องการความรวดเร็วในการทำงานและที่สำคัญที่สุดอย่าลืมเลือกหาทางเลือกอื่นทันทีที่ API ของพื้นเมืองเนรมิต workaurounds ดื้อดึง ซึ่งกำลังจะเกิดขึ้นในไม่ช้า ระยะเวลา
  • แม้จะมีทางออกที่สาม DIY! รู้ว่าสภาพแวดล้อมของคุณ รู้เกี่ยวกับความไม่สอดคล้องกัน อ่านโค้ดของJohn-DavidและJeremy อย่าใช้สิ่งนี้หรือสิ่งนั้นโดยที่ไม่สามารถอธิบายได้ว่าทำไมเลเยอร์ความสอดคล้อง / ความเข้ากันได้จำเป็นต้องใช้จริง ๆ และปรับปรุงเวิร์กโฟลว์ของคุณหรือปรับปรุงประสิทธิภาพแอปของคุณ มีความเป็นไปได้สูงที่ความต้องการของคุณจะพึงพอใจกับโพลีฟิลเรียบง่ายที่คุณสามารถเขียนเองได้อย่างสมบูรณ์แบบ ห้องสมุดทั้งสองเป็นเพียงวานิลลาธรรมดาที่มีน้ำตาลเล็กน้อย พวกเขาทั้งสองเพียงต่อสู้กับผู้ที่ให้บริการพายหอมหวาน แต่เชื่อฉันในท้ายที่สุดทั้งสองเป็นเพียงการปรุงอาหารด้วยน้ำ ไม่มีพระเจ้าของวานิลลาดังนั้นจึงไม่มีสมเด็จพระสันตะปาปาวานิลลาใช่ไหม?

เลือกวิธีการใดที่เหมาะกับความต้องการของคุณมากที่สุด เหมือนอย่างเคย. ฉันต้องการทางเลือกในการใช้งานจริงมากกว่าสูตรโกงความเห็นทุกครั้ง แต่ถึงแม้จะดูเหมือนว่าจะเป็นเรื่องของรสนิยมในปัจจุบัน ติดกับทรัพยากรที่มีคุณภาพเช่นhttp://developer.mozilla.comและhttp://caniuse.comและคุณจะสบายดี


ขอบคุณสำหรับการโพสต์ Lukas บิวด์อินสามารถปรับให้เหมาะสมเพิ่มเติมได้หรือไม่? ฉันรวบรวมพวกเขามีข้อ จำกัด ที่กำหนดโดยมาตรฐานที่ป้องกันไม่ให้พวกเขามีการปรับให้เหมาะสมกับห้องสมุด แต่ฉันไม่ทราบรายละเอียดในทันทีหรือไม่ว่าจะเป็นหรือยังคงเป็นจริง
Brian M. Hunt

เช่น "โดยการปรับให้เหมาะสมสำหรับกรณีการใช้งาน 99% วิธีการ fast.js อาจเร็วกว่า 5x เท่าที่เทียบเท่ากัน" - github.com/codemix/fast.js
Brian M. Hunt

1
สวัสดีไบรอันฉันขอโทษถ้านี่เป็นสิ่งที่ทำให้เข้าใจผิดฉันไม่ได้ตั้งใจจะพูดว่าห้องสมุดเหล่านั้นไม่ได้เร็วไปกว่าพวกที่เทียบเท่ากับพวกเขา หากคุณต้องการประสิทธิภาพอย่างมากในตอนนี้คุณน่าจะดีขึ้นด้วยชุดเครื่องมือเช่น LoDash หรือ fast.js เนื่องจากพวกเขามีการใช้งานวิธีการมาตรฐานที่รวดเร็วยิ่งขึ้น แต่ถ้าคุณเลือกที่จะใช้ไลบรารี่ที่ไม่ถอยกลับไปกับวิธีดั้งเดิมคุณอาจพลาดโอกาสในการเพิ่มประสิทธิภาพในอนาคตของบิวด์อิน เบราว์เซอร์จะพัฒนาขึ้นในที่สุด
Lukas Bünger

4
เบราว์เซอร์ "ผู้ผลิต" มีช่วงเวลาที่ยากลำบากในการรักษามาตรฐานของเบราว์เซอร์ให้มีประสิทธิภาพต่ำกว่ามาก การเพิ่มประสิทธิภาพส่วนใหญ่ในการติดตั้งแบบเนทีฟนั้นเป็นผลมาจากฮาร์ดแวร์ที่เร็วขึ้น "การใช้งานแบบดั้งเดิมจะทัน" ข้อแก้ตัวได้รับรอบปี ปี = นิรันดร์บนอินเทอร์เน็ต หากการใช้งานแบบดั้งเดิมเป็นไปตามที่กำหนดไว้ห้องสมุดจะได้รับการอัปเดตเพื่อใช้งาน นั่นคือสิ่งที่ยอดเยี่ยมเกี่ยวกับโอเพนซอร์ส หากแอป dev ไม่ได้อัปเดตเป็นไลบรารีล่าสุดแอพของพวกเขาจะไม่ช้าลงมันก็จะไม่เร็วขึ้น
Andrew Steitz

2
... แต่ถ้าคุณถามพวกเขาเกี่ยวกับArray.fromพวกเขาอาจจะไม่รู้ด้วยซ้ำว่าควรทำอะไร คน "สายพานยูทิลิตี้" JS ดูเหมือนจะกังวลมากเกินไปกับการส่งเสริมการแก้ปัญหาแบบโอ้ - จีเนียสที่พวกเขามักจะลืมว่าการทำเช่นนั้นพวกเขากำลังทำให้กระบวนการมาตรฐานลดลง ไม่จำเป็นต้องใช้ฟีเจอร์ใด ๆ ทำให้ผู้ผลิต "เบราว์เซอร์" ไม่มีแรงกดดัน ข้อเท็จจริงที่น่าสนุก: เบราว์เซอร์หลัก 2 ใน 4 หลักอิงตามโครงการโอเพ่นซอร์ส ( 1 , 2 )
Lukas Bünger

20

ฉันเห็นด้วยกับสิ่งต่าง ๆ ส่วนใหญ่พูดที่นี่ แต่ฉันต้องการชี้ให้เห็นข้อโต้แย้งในความโปรดปรานของ underscore.js: ขนาดของห้องสมุด

โดยเฉพาะอย่างยิ่งในกรณีที่คุณกำลังพัฒนาแอพหรือเว็บไซต์ที่ต้องการใช้งานบนอุปกรณ์มือถือเป็นส่วนใหญ่ขนาดของชุดผลลัพธ์ที่ได้และผลกระทบที่มีต่อการบูตหรือดาวน์โหลดเวลาอาจมีบทบาทสำคัญ

สำหรับการเปรียบเทียบขนาดเหล่านี้เป็นขนาดที่ฉันสังเกตเห็นด้วย source-map-explorer หลังจากรันการให้บริการไอออนิก:

lodash: 523kB
underscore.js: 51.6kb

แก้ไขก.พ. 2020 :

หนึ่งสามารถใช้BundlePhobiaเพื่อตรวจสอบขนาดปัจจุบันของLo-Dashและขีดล่าง


1
ขอบคุณ Peter นี่เป็นจุดที่ควรค่าที่ควรทราบที่นี่ มีการอภิปรายในที่อื่น ๆ มากขึ้นรวมทั้งเป็น: gist.github.com/alekseykulikov/5f4a6ca69e7b4ebed726 (คำตอบนี้สามารถปรับปรุงได้โดยการเชื่อมโยงการสนทนาอื่น ๆ และอ้างถึงบิตที่เกี่ยวข้อง) ความแตกต่างของขนาดสามารถลดลงได้โดยการเลือกส่วนย่อยของ lodash รวมทั้ง Lodash ที่เขย่าต้นไม้ 🕷
Brian M. Hunt

ขอบคุณ @ BrianM.Hunt สำหรับการตอบกลับของคุณไม่ทราบว่าเป็นไปได้ที่จะรวมส่วนย่อยของ lodash จะได้ดู เมื่อเร็ว ๆ นี้กับอิออนพื้นเมืองอิออนก็ใช้เส้นทางเช่นกันสำหรับ libs พื้นเมืองของพวกเขาโปรดทราบว่ายิ่งกังวลมากขึ้นเกี่ยวกับขนาดของแอป
David Dal Busco

1
ฉันสงสัยว่าคุณได้รับ 523kB ที่ไหน lodash.comกล่าวว่าบีบอัดได้เพียง 24kB เท่านั้น ดาวน์โหลดเป็นเพียง 74kB
Martian2049

1
โพสต์ของฉันถูกสร้างขึ้นในเดือนเมษายน 2017 เหมือนที่ฉันพูดในความคิดเห็นของฉันsource-map-explorer after running ionic serve
David Dal Busco

5
ในเดือนมีนาคม 2018 - lodash.min.js คือ 72,5 kB และขีดล่าง -min.js คือ 16,4 kB
รวม

10

ไม่แน่ใจว่านั่นคือสิ่งที่ OP หมายถึงหรือไม่ แต่ฉันเข้ามาถามคำถามนี้เพราะฉันกำลังค้นหารายการปัญหาที่ฉันต้องจำไว้เมื่อย้ายจากขีดล่างไปจนถึงบ้านพัก

ฉันจะขอบคุณมากหากมีคนโพสต์บทความที่มีรายการความแตกต่างดังกล่าวทั้งหมด ให้ฉันเริ่มต้นด้วยสิ่งที่ฉันได้เรียนรู้วิธีที่ยาก (นั่นคือสิ่งที่ทำให้รหัสของฉันระเบิดในการผลิต: /):

  • _.flattenในการขีดเส้นใต้จะลึกโดยค่าเริ่มต้นและคุณต้องผ่านความจริงเป็นอาร์กิวเมนต์ที่สองเพื่อให้มันตื้น ใน Lodash มันเป็นค่าเริ่มต้นที่ตื้นและผ่านความจริงเป็นอาร์กิวเมนต์ที่สองจะทำให้มันลึก! :)
  • _.lastในเครื่องหมายขีดล่างยอมรับอาร์กิวเมนต์ที่สองซึ่งบอกจำนวนองค์ประกอบที่คุณต้องการ ในlodashไม่มีตัวเลือกดังกล่าว คุณสามารถเลียนแบบสิ่งนี้ด้วย.slice
  • _.first (ปัญหาเดียวกัน)
  • _.templateในขีดล่างสามารถใช้งานได้หลายวิธีโดยหนึ่งในนั้นคือการจัดเตรียมสตริงของแม่แบบและข้อมูลและรับHTMLกลับมา ในlodashคุณได้รับฟังก์ชั่นที่คุณควรฟีดด้วยข้อมูล
  • _(something).map(foo)ทำงานในขีด แต่ใน lodash _.map(something,foo)ผมต้องเขียนมันไป บางทีนั่นอาจเป็นเพียงการTypeScriptออกใหม่

4
ใน lodash การผูกมัดจะผ่านตัววนซ้ำอย่างเกียจคร้านและต้องการและสิ้นสุดเช่น_(something).map(foo).value()นั้น
Brian M. Hunt

ทั้งหมดนี้สามารถตีคุณได้ถ้าคุณใช้ Backbone Collection ซึ่งพร็อกซี่ที่เรียกไปยังไลบรารีเหล่านี้ - ตัวอย่างเช่น collection.first (5) จะไม่ให้องค์ประกอบ 5 ชิ้นแรก แต่จะเป็นองค์ประกอบแรก :)
qbolec

8

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

บทความล่าสุดเปรียบเทียบทั้งสองโดย Ben McCormick:

  1. API ของ Lo-Dash เป็นชุดของ Underscore

  2. ภายใต้ประทุน [Lo-Dash] ได้รับการเขียนใหม่อย่างสมบูรณ์

  3. Lo-Dash นั้นไม่ช้ากว่า Underscore อย่างแน่นอน

  4. มีการเพิ่ม Lo-Dash อะไร

    • การปรับปรุงการใช้งาน
    • ฟังก์ชั่นพิเศษ
    • ผลการดำเนินงาน
    • ชวเลขไวยากรณ์สำหรับการผูกมัด
    • Custom Builds ใช้เฉพาะสิ่งที่คุณต้องการ
    • การกำหนดเวอร์ชันความหมายและรหัสครอบคลุม 100%

6

ฉันเพิ่งพบความแตกต่างหนึ่งที่จบลงด้วยการเป็นสิ่งสำคัญสำหรับฉัน เวอร์ชันที่ไม่รองรับขีดล่างของ lodash _.extend()ไม่ได้คัดลอกไปยังคุณสมบัติหรือเมธอดที่กำหนดระดับคลาส

ฉันได้สร้างการทดสอบดอกมะลิใน CoffeeScript ที่แสดงสิ่งนี้:

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

โชคดีที่lodash.underscore.jsรักษาพฤติกรรมของ Underscore ในการคัดลอกทุกสิ่งซึ่งสำหรับสถานการณ์ของฉันคือพฤติกรรมที่ต้องการ



0

ส่วนใหญ่แล้วขีดล่างคือเซตย่อยของ lodash บางครั้งเช่นขีดล่างในปัจจุบันจะมีฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่น่ากลัวไม่ได้มีเหมือน mapObject สิ่งนี้ช่วยฉันประหยัดเวลาได้มากในการพัฒนาโครงการของฉัน


ในขณะนี้เรามี _.mapValues
crapthings

@crapthings - ในช่วงเวลาของโพสต์นี้ฉันรู้ว่าอาจค่าและ mapKeys แต่พวกเขาไม่เหมือนกับ mapObject อาจมีหลายกรณีที่จะใช้อีกอันหนึ่ง แต่ mapObject เป็นฟังก์ชั่นของตัวเองทั้งหมด
rashadb

0

พวกมันคล้ายกันมากกับLodashกำลังยึดครอง ...

พวกเขาทั้งสองเป็นห้องสมุดยูทิลิตี้ที่ใช้โลกของยูทิลิตี้ใน JavaScript ...

Seems Lodashกำลังได้รับการอัปเดตอย่างสม่ำเสมอมากขึ้นในตอนนี้เพื่อใช้ในโครงการล่าสุด ...

นอกจากนี้ยังLodashดูเหมือนว่ามีน้ำหนักเบาโดยคู่ของ KB ที่แล้ว ...

ทั้งสองมี api และ doc ที่ดี แต่ฉันคิดว่าLodashดีกว่า ...

นี่คือภาพหน้าจอสำหรับเอกสารแต่ละรายการสำหรับรับค่าอาร์เรย์ลำดับแรก ...

ขีดล่าง:

ขีด

lodash: lodash

เนื่องจากบางสิ่งอาจได้รับการอัปเดตเป็นครั้งคราวเพียงตรวจสอบเว็บไซต์ของพวกเขาด้วย ...

lodash

ขีด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.