Sự khác nhau giữa lodash và gạch dưới [đóng]


1602

Tại sao ai đó thích thư viện tiện ích lodash.js hoặc underscore.js hơn thư viện khác?

Lodash dường như là một sự thay thế thả xuống cho gạch dưới, cái sau đã tồn tại lâu hơn.

Tôi nghĩ cả hai đều tuyệt vời, nhưng tôi không biết đủ về cách họ làm việc để tạo ra một so sánh có giáo dục, và tôi muốn biết thêm về sự khác biệt.


2
Bạn có thể muốn xem một số diễn xuất trên màn hình về lodash được liên kết trên trang github của nó. Cá nhân tôi đã sử dụng underscore.js, nhưng nhiều hơn vì đó là những gì tôi đã bắt đầu và như bạn nói nó đã tồn tại lâu hơn.
Jack

26
lodashunderscoređang theo chủ đề hợp nhất ngay bây giờ
zangw

Câu trả lời:


2023

Tôi đã tạo Lo-Dash để cung cấp hỗ trợ lặp lại môi trường chéo nhất quán hơn cho các mảng, chuỗi, đối tượng và argumentsđối tượng 1 . Nó đã trở thành một siêu ký tự của Underscore, cung cấp hành vi API phù hợp hơn, nhiều tính năng hơn (như hỗ trợ AMD, nhân bản sâu và hợp nhất sâu), kiểm tra tài liệu và đơn vị kỹ lưỡng hơn (các thử nghiệm chạy trong Node, Ringo, Rhino, Narwhal, PhantomJS và trình duyệt), hiệu suất tổng thể tốt hơn và tối ưu hóa cho các mảng / lặp đối tượng lớn và linh hoạt hơn với các bản dựng tùy chỉnh và các tiện ích tiền biên dịch mẫu.

Vì Lo-Dash được cập nhật thường xuyên hơn Underscore, nên một bản lodash underscoredựng được cung cấp để đảm bảo khả năng tương thích với phiên bản ổn định mới nhất của Underscore.

Tại một thời điểm, tôi thậm chí còn được cấp quyền truy cập vào Underscore, một phần vì Lo-Dash chịu trách nhiệm đưa ra hơn 30 vấn đề; sửa lỗi hạ cánh, các tính năng mới và tăng hoàn hảo trong Underscore v1.4.x +.

Ngoài ra, có ít nhất 3 mẫu nồi hơi xương sống bao gồm Lo-Dash theo mặc định và Lo-Dash hiện được đề cập trong tài liệu chính thức của Backbone .

Kiểm tra bài đăng của Kit Cambridge, nói "Xin chào" với Lo-Dash , để biết thêm chi tiết về sự khác biệt giữa Lo-Dash và Underscore.

Chú thích:

  1. Underscore có sự hỗ trợ không nhất quán cho mảng, chuỗi, đối tượng và argumentsđối tượng. Trong các trình duyệt mới hơn, các phương thức Underscore bỏ qua các lỗ hổng trong mảng , các phương thức "Đối tượng" lặp lại argumentscác đối tượng, các chuỗi được coi là giống như mảng và các phương thức lặp lại chính xác các hàm (bỏ qua thuộc tính "nguyên mẫu" của chúng) và các đối tượng (lặp lại các thuộc tính bị bóng như "toString" và "valueOf"), trong khi trong các trình duyệt cũ hơn thì không. Ngoài ra, các phương thức gạch dưới như _.clonebảo toàn các lỗ trong mảng, trong khi các phương pháp khác _.flattenthì không.

174
@Brian - Trong khi phát triển Lo-Dash, tôi tiếp tục đặt câu hỏi "Ai đó có thể chỉ ra điều gì, trong Lo-Dash, là một tiêu cực so với Underscore?" và sau đó giải quyết chúng. Đây là lý do tại sao tôi đã tăng cường tài liệu, thêm các bản dựng tùy chỉnh và làm cho nguồn dễ đọc hơn.
John-David Dalton

10
Tôi rất muốn đăng một số điểm chuẩn, nhưng điều đó có thể trở nên tẻ nhạt. Đủ để nói rằng mọi điểm chuẩn tôi đã chạy đã chứng minh Lo-Dash nhanh hơn ( NHIỀU nhanh hơn trong nhiều trường hợp) so với gạch dưới.
Wil Moore III

186
Tôi yêu lo-dash và tôi đang sử dụng nó, vì vậy xin đừng nghĩ rằng tôi đang bash, nhưng tại sao không đóng góp vào gạch dưới thay vì tạo một thư viện mới?
Xananax

133
@Xananax - kiểm tra chuỗi nhận xét: github.com/jashkenas/underscore/commit/ mẹo - điều này có thể trả lời câu hỏi đó.
Rob Grant

41
Đã có bất kỳ nỗ lực để hợp nhất lodash trở lại gạch dưới?
đèn đường ngày

186

Lo-Dash được lấy cảm hứng từ gạch dưới, nhưng ngày nay là giải pháp ưu việt. Bạn có thể tạo các bản dựng tùy chỉnh của mình , có hiệu suất cao hơn , hỗ trợ AMD và có các tính năng bổ sung tuyệt vời . Kiểm tra điểm chuẩn Lo-Dash vs Underscore này trên jsperf và .. bài đăng tuyệt vời này về lo-dash :

Một trong những tính năng hữu ích nhất khi bạn làm việc với các bộ sưu tập, là cú pháp tốc ký:

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 }]

(lấy từ tài liệu lodash )


1
Liên kết đến blog của Kit Cambridge rất nhiều thông tin.
Brian M. Hunt

Tôi nghĩ rằng điều này là sai (ví dụ nhổ lông). Kể từ bản cập nhật 1.8.3 mới nhất, bạn có thể sử dụng cách nhổ tương tự như lodash. dù sao đối với các phiên bản trước tôi không nghĩ rằng gạch dưới sẽ hiển thị một chức năng giống với bản đồ (ví dụ gạch dưới của bạn có vẻ giống như một chức năng bản đồ)
alexserver

7
filtertính năng gạch dưới từ năm 2012 github.com/jashkenas/underscore/issues/648 (tên của nó là where)
Muhammad Hewedy

Tôi đang gặp lỗi 500 trên liên kết điểm chuẩn Lo-Dash vs Underscore
Hylle

86

Nếu giống như tôi, bạn đang mong đợi một danh sách các khác biệt về cách sử dụng giữa gạch dưới và lodash, thì có một hướng dẫn để chuyển từ gạch dưới sang lodash .

Đây là trạng thái hiện tại của nó cho hậu thế:

  • Gạch dưới _.anylà Lodash_.some
  • Gạch dưới _.alllà Lodash_.every
  • Gạch dưới _.composelà Lodash_.flowRight
  • Gạch dưới _.containslà Lodash_.includes
  • Gạch dưới _.eachkhông cho phép thoát bằng cách quay lạifalse
  • Gạch dưới _.findWherelà Lodash_.find
  • Underscore _.flattenlà sâu theo mặc định trong khi Lodash nông
  • Underscore _.groupByhỗ trợ một iteratee được truyền các tham số (value, index, originalArray), trong khi ở Lodash, iteratee _.groupBychỉ được truyền một tham số duy nhất : (value).
  • Gạch dưới _.indexOfvới tham số thứ 3 undefinedlà Lodash_.indexOf
  • Gạch dưới _.indexOfvới tham số thứ 3 truelà Lodash_.sortedIndexOf
  • Gạch dưới _.indexBylà Lodash_.keyBy
  • Gạch dưới _.invokelà Lodash_.invokeMap
  • Gạch dưới _.mapObjectlà Lodash_.mapValues
  • Underscore _.maxkết hợp Lodash _.max&_.maxBy
  • Underscore _.minkết hợp Lodash _.min&_.minBy
  • Underscore _.samplekết hợp Lodash _.sample&_.sampleSize
  • Underscore _.objectkết hợp Lodash _.fromPairs_.zipObject
  • Gạch dưới _.omitbởi một vị ngữ là Lodash_.omitBy
  • Gạch dưới _.pairslà Lodash_.toPairs
  • Gạch dưới _.pickbởi một vị ngữ là Lodash_.pickBy
  • Gạch dưới _.plucklà Lodash_.map
  • Underscore _.sortedIndexkết hợp Lodash _.sortedIndex&_.sortedIndexOf
  • Gạch dưới _.uniqbởi một iterateelà Lodash_.uniqBy
  • Gạch dưới _.wherelà Lodash_.filter
  • Underscore _.isFinitekhông phù hợp với Number.isFinite
    (ví dụ _.isFinite('1')trả về truetrong Underscore nhưng falsetrong Lodash)
  • Tốc _.matcheský gạch dưới không hỗ trợ so sánh sâu
    (ví dụ _.filter(objects, { 'a': { 'b': 'c' } }))
  • Gạch dưới ≥ 1.7 & _.templateCú pháp tạm dừng là
    _.template(string, option)(data)
  • Bộ _.memoizeđệm tạm thời Mapgiống như đồ vật
  • Lodash không hỗ trợ một contextđối số cho nhiều phương pháp có lợi cho_.bind
  • Lodash hỗ trợ chuỗi ngầm , chuỗi lười biếng và hợp nhất phím tắt
  • Lodash chia nó quá tải _.head, _.last, _.rest, & _.initialra vào
    _.take, _.takeRight, _.drop, & _.dropRight
    (nghĩa là _.head(array, 2)trong dấu gạch dưới là _.take(array, 2)trong Lodash)

1
Tôi đã gặp phải những vấn đề này khi di chuyển và tôi đang duy trì một tài liệu chéo (WIP) đi giữa cái này và cái khác. Hy vọng nó cũng hữu ích cho những người khác!
luxon

60

Ngoài câu trả lời của John, và đọc lên lodash (mà tôi đã coi là "tôi cũng vậy", và xem các bài kiểm tra hiệu suất, đọc mã nguồn và bài đăng trên blog , một vài điểm tạo ra lodash vượt trội hơn nhiều so với gạch dưới là:

  1. Đó không phải là về tốc độ, mà là về sự nhất quán của tốc độ (?)

    Nếu bạn nhìn vào mã nguồn của gạch dưới, bạn sẽ thấy trong một vài dòng đầu tiên gạch dưới trở lại các triển khai gốc của nhiều hàm. Mặc dù trong một thế giới lý tưởng, đây sẽ là một cách tiếp cận tốt hơn, nếu bạn nhìn vào một số liên kết hoàn hảo được đưa ra trong các slide này , không khó để đưa ra kết luận rằng chất lượng của những 'triển khai bản địa' đó thay đổi rất nhiều trình duyệt- trình duyệt. Firefox rất nhanh trong một số chức năng và trong một số Chrome chiếm ưu thế. (Tôi tưởng tượng sẽ có một số kịch bản mà IE cũng sẽ thống trị). Tôi tin rằng tốt hơn là thích một mã có hiệu suất phù hợp hơn trên các trình duyệt.

    Đừng đọc bài đăng trên blog sớm hơn và thay vì tin vào điều đó, hãy tự đánh giá bản thân bằng cách chạy các điểm chuẩn . Tôi choáng váng ngay bây giờ, khi thấy một lodash hoạt động nhanh hơn 100-150% so với gạch dưới trong các chức năng nguyên gốc , đơn giản như trong Chrome!Array.every

  2. Các tính năng bổ sung trong lodash cũng khá hữu ích.

  3. Đối với nhận xét được đánh giá cao của Xananax cho thấy đóng góp cho mã gạch dưới: Luôn luôn tốt hơn để cạnh tranh TỐT , không chỉ giúp cải tiến mà còn giúp bạn giữ cho mình (hoặc thư viện của bạn) ở trạng thái tốt.

Dưới đây là danh sách các điểm khác biệt giữa lodash và bản gạch dưới của nó là sự thay thế thả xuống cho các dự án gạch dưới của bạn.


6
Trong trường hợp nào thì "tính nhất quán của tốc độ" là một giá trị? Giả sử, tôi có một phương pháp có tốc độ 100% trong FF và trong IE và một triển khai riêng sẽ có tốc độ 80% trong IE và 120% trong FF (hoặc ngược lại). Sau đó, tôi sẽ nói rằng sẽ tốt khi sử dụng triển khai riêng trong FF và triển khai riêng trong IE. Tôi không thể tưởng tượng bất kỳ trường hợp nào, nơi tôi sẽ nói: Hãy làm chậm FF chỉ với lý do có cùng tốc độ như trong IE. Kích thước của mã và khả năng bảo trì hoặc sự chậm lại trung bình trong tất cả các trình duyệt sẽ là đối số, nhưng tính nhất quán của tốc độ?
stofl

2
Ý tôi là, "tốc độ nhanh hơn liên tục"
kumarharsh

1
Điều gì về sự khác biệt về kích thước? Giả sử bạn tạo một bản dựng tùy chỉnh với lodash có chính xác chức năng tương tự như gạch dưới? Có một sự khác biệt lớn giữa họ? Tôi đoán sẽ thực hiện lại thêm trọng lượng cho trang web.
F Lekschas

5
Tôi có xu hướng dự phòng việc triển khai riêng của trình duyệt chỉ vì trong hầu hết các trường hợp, nó có hiệu suất chấp nhận được và có thể cải thiện với các bản cập nhật trình duyệt mà không phải lo lắng để giữ cho thư viện luôn cập nhật.
orad

3
@KumarHarsh Có lẽ tôi đã không diễn đạt tốt. Tôi có nghĩa là tôi có xu hướng sử dụng một thư viện sử dụng các hàm riêng nếu có sẵn, thay vì luôn thích thực hiện riêng của nó.
orad

42

Đây là năm 2014 và một vài năm quá muộn. Tôi vẫn nghĩ rằng quan điểm của tôi là:

IMHO cuộc thảo luận này đã bị thổi ra khỏi tỷ lệ khá nhiều. Trích dẫn bài viết trên blog nói trên :

Hầu hết các thư viện tiện ích JavaScript, chẳng hạn như Underscore, Valentine và wu, đều dựa vào cách tiếp cận kép đầu tiên của bản địa. Cách tiếp cận này thích các triển khai gốc hơn, chỉ quay lại JavaScript vanilla nếu không hỗ trợ tương đương gốc. Nhưng jsPerf đã tiết lộ một xu hướng thú vị: cách hiệu quả nhất để lặp lại một bộ sưu tập giống như mảng hoặc là tránh hoàn toàn các triển khai gốc, thay vào đó chọn các vòng lặp đơn giản.

Như thể "các vòng lặp đơn giản" và "vanilla Javascript" có nguồn gốc hơn các triển khai phương thức Array hoặc Object. Trời ...

Chắc chắn sẽ rất tốt nếu có một nguồn sự thật, nhưng không có. Ngay cả khi bạn được nói khác đi, không có Thần Vanilla, em yêu. Tôi xin lỗi. Giả định duy nhất thực sự đúng là tất cả chúng ta đều đang viết mã Javascript nhằm mục đích hoạt động tốt trong tất cả các trình duyệt chính, biết rằng tất cả chúng đều có các triển khai khác nhau của cùng một thứ. Đó là một con chó cái để đối phó với, để nói một cách nhẹ nhàng. Nhưng đó là tiền đề, dù bạn có thích hay không.

Có thể bạn đang làm việc trên các dự án quy mô lớn cần hiệu suất twitter để bạn thực sự thấy sự khác biệt giữa 850.000 (gạch dưới) so với 2.500.000 (lặp lại) trong một danh sách mỗi giây ngay bây giờ!

Tôi cho một người không. Ý tôi là, tôi đã làm việc với các dự án mà tôi phải giải quyết các vấn đề về hiệu suất, nhưng chúng không bao giờ được giải quyết hoặc gây ra bởi cả Underscore và Lo-Dash. Và trừ khi tôi nắm được sự khác biệt thực sự trong triển khai và hiệu suất (chúng ta đang nói về C ++ ngay bây giờ), hãy nói một vòng lặp trên một vòng lặp (đối tượng hoặc mảng, thưa thớt hay không!), Tôi không bị làm phiền với bất kỳ khiếu nại dựa trên kết quả của một nền tảng chuẩn đã được quan tâm .

Rhino chỉ cần một bản cập nhật duy nhất cho phép Rhino thiết lập các triển khai phương thức Array của mình theo cách mà không một phương thức "vòng lặp thời trung cổ nào hoạt động tốt hơn và mãi mãi" và linh mục có thể tranh luận theo cách của mình xung quanh sự thật đơn giản rằng tất cả một phương thức mảng đột ngột trong FF nhanh hơn nhiều so với phương pháp cân não của anh ấy / cô ấy. Man, bạn không thể lừa dối môi trường thời gian chạy của bạn bằng cách gian lận môi trường thời gian chạy của bạn! Hãy nghĩ về điều đó khi quảng bá ...

vành đai tiện ích của bạn

... lần tới.

Vì vậy, để giữ cho nó có liên quan:

  • Sử dụng Underscore nếu bạn thuận tiện mà không phải hy sinh bản địa.
  • Sử dụng Lo-Dash nếu bạn thấy thuận tiện và thích danh mục tính năng mở rộng của nó (bản sao sâu, v.v.) và nếu bạn đang rất cần hiệu suất tức thì và quan trọng nhất là đừng bận tâm đến việc thay thế ngay khi API gốc workauround ý kiến. Điều đó sẽ xảy ra sớm. Giai đoạn = Stage.
  • Thậm chí còn có một giải pháp thứ ba. Tự làm! Biết môi trường của bạn. Biết về sự không nhất quán. Đọc mã của họ ( John-DavidJeremy ). Không sử dụng cái này hoặc cái kia mà không thể giải thích tại sao một lớp nhất quán / tương thích là thực sự cần thiết và tăng cường quy trình làm việc của bạn hoặc cải thiện hiệu suất của ứng dụng của bạn. Rất có khả năng các yêu cầu của bạn được thỏa mãn với một polyfill đơn giản mà bạn hoàn toàn có thể tự viết. Cả hai thư viện chỉ là vani đơn giản với một chút đường. Cả hai chỉ chiến đấu vì những người phục vụ những chiếc bánh ngọt ngào nhất . Nhưng tin tôi đi, cuối cùng cả hai chỉ nấu với nước. Không có Thần Vanilla nên không thể không có giáo hoàng Vanilla, phải không?

Chọn bất cứ cách tiếp cận nào phù hợp với nhu cầu của bạn nhất. Như thường lệ. Tôi thích dự phòng cho việc triển khai thực tế hơn gian lận thời gian chạy có ý kiến ​​bất cứ lúc nào nhưng ngay cả điều đó dường như là một vấn đề của hương vị ngày nay. Bám sát các tài nguyên chất lượng như http://developer.mozilla.comhttp://caniuse.com và bạn sẽ ổn thôi.


Cảm ơn đã đăng bài của Lukas. Các tích hợp có thể được tối ưu hóa hơn nữa? Tôi tập hợp họ có các ràng buộc áp đặt bởi các tiêu chuẩn ngăn họ có tối ưu hóa tương đương với các thư viện, nhưng tôi không biết các chi tiết một cách trực tiếp hoặc liệu điều này có đúng hay không.
Brian M. Hunt

ví dụ: "Bằng cách tối ưu hóa cho trường hợp sử dụng 99%, các phương thức fast.js có thể nhanh hơn gấp 5 lần so với tương đương gốc của chúng." - github.com/codemix/fast.js
Brian M. Hunt

1
Xin chào Brian, tôi xin lỗi nếu điều này gây hiểu lầm, tôi không có ý nói rằng những thư viện đó không nhanh hơn nhiều so với tương đương bản địa của chúng. Nếu bạn đang rất cần hiệu năng ngay bây giờ , có lẽ bạn nên sử dụng bộ công cụ như LoDash hoặc fast.js vì chúng cung cấp các phương thức tiêu chuẩn nhanh hơn. Nhưng nếu bạn chọn sử dụng một thư viện không dựa trên các phương thức gốc, bạn có thể bỏ lỡ bất kỳ tối ưu hóa hiệu suất nào trong tương lai trên các phần mềm tích hợp. Trình duyệt sẽ phát triển cuối cùng.
Lukas Bünger

4
Các "nhà sản xuất" trình duyệt có một thời gian khó giữ các tiêu chuẩn trình duyệt của họ tuân thủ, ít hiệu suất hơn nhiều. Hầu hết các hiệu suất đạt được trong việc thực hiện riêng là kết quả của phần cứng nhanh hơn. Cái cớ "triển khai bản địa sẽ bắt kịp" đã có từ nhiều năm nay. Năm = vĩnh cửu trên internet. NẾU triển khai riêng từng bắt kịp, các thư viện sẽ được cập nhật để sử dụng chúng. Đó là điều tuyệt vời về nguồn mở. Nếu một nhà phát triển ứng dụng không cập nhật lên thư viện mới nhất, ứng dụng của họ sẽ không bị chậm, nó sẽ không tăng tốc.
Andrew Steitz

2
... nhưng nếu bạn hỏi họ về Array.fromhọ thì có lẽ họ sẽ không biết phải làm gì. Mọi người "vành đai tiện ích" của JS dường như quá quan tâm đến việc thúc đẩy các cách giải quyết khác thường của họ đến nỗi họ có xu hướng quên rằng bằng cách đó, họ thực sự đang làm loãng quá trình tiêu chuẩn hóa. Không cần các tính năng dẫn đến không có áp lực đối với "nhà sản xuất" trình duyệt. Sự thật thú vị: 2 trong số 4 trình duyệt chính dựa trên các dự án nguồn mở ( 1 , 2 ).
Lukas Bünger

20

Tôi đồng ý với hầu hết những điều được nói ở đây nhưng tôi chỉ muốn chỉ ra một đối số có lợi cho underscore.js: kích thước của thư viện.

Đặc biệt trong trường hợp bạn đang phát triển một ứng dụng hoặc trang web có ý định sử dụng chủ yếu trên thiết bị di động, kích thước của gói kết quả và ảnh hưởng đến thời gian khởi động hoặc tải xuống có thể có một vai trò quan trọng.

Để so sánh, các kích thước này là những kích thước tôi nhận thấy với trình thám hiểm nguồn-map sau khi chạy phục vụ ion:

lodash: 523kB
underscore.js: 51.6kb

chỉnh sửa tháng 2 năm 2020 :

người ta có thể sử dụng BundlePhobia để kiểm tra kích thước hiện tại của Lo-DashUnderscore


1
Cảm ơn Peter, đây là một điểm đáng lưu ý ở đây. Có nhiều cuộc thảo luận ở nơi khác, bao gồm: gist.github.com/alekseykulikov/5f4a6ca69e7b4ebed726 . (Câu trả lời này có thể được cải thiện bằng cách liên kết một số cuộc thảo luận khác và trích dẫn các bit có liên quan) Sự khác biệt về kích thước có thể được giảm bằng cách chọn các phần phụ của lodash, cộng với lodash lắc cây. 🕷
Brian M. Hunt

Thx @ BrianM. Cho câu trả lời của bạn, không biết rằng có thể bao gồm các phần phụ của lodash, sẽ có một cái nhìn. Gần đây với người bản xứ, Ionic đã đi một con đường như vậy cho những người bản địa của họ, thật tốt khi lưu ý rằng nhiều người quan tâm hơn về kích thước ứng dụng
David Dal Busco

1
tôi tự hỏi bạn đã lấy 523kB ở đâu? lodash.com nói rằng nó chỉ được nén 24kB. tải chỉ 74kB
Martian2049

1
bài viết của tôi đã được thực hiện vào tháng 4 năm 2017. như tôi đã nói trong bình luận của mình,source-map-explorer after running ionic serve
David Dal Busco

5
Vào tháng 3 năm 2018 - lodash.min.js là 72,5 kB và gạch dưới-min.js là 16,4 kB
Kết hợp

10

Không chắc đó có phải ý của OP không, nhưng tôi đã gặp phải câu hỏi này bởi vì tôi đang tìm kiếm một danh sách các vấn đề tôi phải ghi nhớ khi chuyển từ gạch dưới sang lodash.

Tôi thực sự sẽ đánh giá cao nếu ai đó đăng một bài viết với một danh sách đầy đủ về sự khác biệt như vậy. Hãy để tôi bắt đầu với những điều tôi đã học được một cách khó khăn (đó là, những điều làm cho mã của tôi bùng nổ khi sản xuất: /):

  • _.flattentrong gạch dưới là sâu theo mặc định và bạn phải truyền đúng như đối số thứ hai để làm cho nó nông. Trong lodash, nó mặc định là nông và truyền đúng như đối số thứ hai sẽ làm cho nó sâu sắc! :)
  • _.lasttrong gạch dưới chấp nhận một đối số thứ hai cho biết bạn muốn bao nhiêu phần tử. Tronglodash đó không có lựa chọn như vậy. Bạn có thể mô phỏng điều này với.slice
  • _.first (cùng một vấn đề)
  • _.templatetrong gạch dưới có thể được sử dụng theo nhiều cách, một trong số đó là cung cấp chuỗi mẫu và dữ liệu và lấy HTMLlại (hoặc ít nhất đó là cách nó hoạt động cách đây một thời gian). Tronglodash bạn nhận được một chức năng mà sau đó bạn sẽ cung cấp dữ liệu.
  • _(something).map(foo)hoạt động trong gạch dưới, nhưng trong lodash tôi đã phải viết lại nó _.map(something,foo). Có lẽ đó chỉ là một sự TypeScriptban hành

4
Trong lodash, chained vượt qua một trình vòng lặp lười biếng, và yêu cầu và điểm cuối như thế nào _(something).map(foo).value().
Brian M. Hunt

Tất cả điều này có thể đánh vào bạn nếu bạn sử dụng Bộ sưu tập xương sống mà proxy gọi đến các thư viện này - ví dụ: Collection.first (5) sẽ không cung cấp cho bạn 5 yếu tố đầu tiên, mà là yếu tố đầu tiên :)
qbolec

8

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

Bài viết mới nhất so sánh hai của Ben McCormick:

  1. API của Lo-Dash là một siêu nhóm của Underscore.

  2. Dưới mui xe [Lo-Dash] đã được viết lại hoàn toàn.

  3. Lo-Dash chắc chắn không chậm hơn Underscore.

  4. Lo-Dash đã thêm gì?

    • Cải tiến khả năng sử dụng
    • Chức năng bổ sung
    • Hiệu suất đạt được
    • Cú pháp tốc ký cho chuỗi
    • Bản dựng tùy chỉnh để chỉ sử dụng những gì bạn cần
    • Phiên bản ngữ nghĩa và bảo hiểm mã 100%

6

Tôi chỉ tìm thấy một sự khác biệt cuối cùng là quan trọng đối với tôi. Các phiên bản không tương thích với gạch của lodash của _.extend()không không sao chép trên các thuộc tính hoặc phương thức được xác định ở cấp độ lớp.

Tôi đã tạo một thử nghiệm Jasmine trong CoffeeScript để chứng minh điều này:

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

May mắn thay, lodash.underscore.jsduy trì hành vi sao chép mọi thứ của Underscore, mà đối với tình huống của tôi là hành vi mong muốn.



0

Đối với hầu hết các phần gạch dưới là tập con của lodash. Đôi khi, giống như hiện tại gạch dưới sẽ có các chức năng nhỏ thú vị mà lodash không có như mapObject. Điều này giúp tôi tiết kiệm rất nhiều thời gian trong việc phát triển dự án của tôi.


tại thời điểm đó, chúng tôi có _.mapValues
crapthings

@crapthings - tại thời điểm đăng bài này, tôi biết về mayValues ​​và mapKeys nhưng chúng không giống với mapObject. Có thể có những trường hợp để áp dụng cái này nhưng cái kia thì mapObject là một hàm riêng.
rashadb

0

Chúng khá giống nhau, với Lodash đang tiếp quản ...

Cả hai đều là một thư viện tiện ích bao gồm thế giới tiện ích trong JavaScript ...

Có vẻ như Lodash đang được cập nhật thường xuyên hơn bây giờ, vì vậy được sử dụng nhiều hơn trong các dự án mới nhất ...

Ngoài ra, Lodash dường như nhẹ hơn bởi một vài KB ...

Cả hai đều có một api và doc tốt, nhưng tôi nghĩ rằng Lodash one tốt hơn ...

Dưới đây là ảnh chụp màn hình cho mỗi tài liệu để nhận giá trị đầu tiên của một mảng ...

gạch dưới:

gạch dưới

nhà nghỉ: nhà nghỉ

Vì mọi thứ có thể được cập nhật theo thời gian, chỉ cần kiểm tra trang web của họ ...

nhà nghỉ

gạch dưới

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.