etc./StackOverFlow

Lodash와 Underscore.js의 차이점

청렴결백한 만능 재주꾼 2022. 1. 14. 12:32
반응형

질문자 :Brian M. Hunt


누군가가 다른 것보다 Lodash 또는 Underscore.js 유틸리티 라이브러리를 선호하는 이유는 무엇입니까?

Lodash는 밑줄을 대체하는 것으로 보이며 후자는 더 오래 사용되었습니다.

제 생각에는 둘 다 훌륭하다고 생각합니다. 그러나 교육적으로 비교하기 위해 그들이 어떻게 작동하는지에 대해 충분히 알지 못하며 차이점에 대해 더 알고 싶습니다.



arguments 개체 1 에 대해 보다 일관된 교차 환경 반복 지원을 제공하기 위해 Lodash를 만들었습니다. 이후 Underscore.js의 상위 집합이 되어 보다 일관된 API 동작, 더 많은 기능 (AMD 지원, 심층 복제, 심층 병합 등), 더 철저한 문서화 및 단위 테스트(Node.js , RingoJS , Rhino 에서 실행되는 테스트)를 제공합니다. , Narwhal , PhantomJS 및 브라우저), 대규모 배열/객체 반복에 대한 전반적인 성능 및 최적화 향상, 맞춤형 빌드 및 템플릿 사전 컴파일 유틸리티를 통한 유연성 향상.

Lodash는 Underscore.js보다 더 자주 업데이트되기 때문에 최신 안정 버전의 Underscore.js와의 호환성을 보장하기 위해 lodash underscore 빌드 가 제공됩니다.

한때 나는 Underscore.js에 대한 푸시 액세스 권한 도 부여받았습니다. 부분적으로 Lodash가 30개 이상의 문제를 제기하는 책임이 있기 때문입니다. Underscore.js v1.4.x+의 랜딩 버그 수정, 새로운 기능 및 성능 향상.

또한 기본적으로 Lodash를 포함하는 Backbone.js 상용구가 3개 이상 있으며 이제 Lodash가 Backbone.js의 공식 문서에 언급됩니다.

Lodash와 Underscore.js의 차이점에 대해 자세히 알아보려면 Kit Cambridge의 게시물, Say "Hello" to Lo-Dash를 확인하세요.

각주:

  1. Underscore.js는 배열, 문자열, 개체 및 arguments 개체에 대한 지원이 일관되지 않습니다. 최신 브라우저에서 Underscore.js 메서드는 배열의 구멍을 무시하고, "Objects" 메서드는 arguments 개체를 반복하고, 문자열은 배열과 유사한 것으로 처리하고, 메서드는 함수("prototype" 속성 무시) 및 개체("와 같은 그림자 속성 반복)를 올바르게 반복합니다. toString" 및 "valueOf"), 이전 브라우저에서는 그렇지 않습니다. _.clone 과 같은 Underscore.js 메서드는 배열의 구멍을 유지하지만 _.flatten 과 같은 메서드는 그렇지 않습니다.

John-David Dalton

Lodash는 Underscore.js에서 영감을 얻었지만 오늘날에는 더 나은 솔루션입니다. 사용자 정의 빌드를 만들고 , 더 높은 성능을 갖고 , AMD를 지원하고, 훌륭한 추가 기능을 가질 수 있습니다. jsperf에서 이 Lodash 대 Underscore.js 벤치마크 를 확인하고... Lodash에 대한 이 멋진 게시물을 확인하세요 .

컬렉션으로 작업할 때 가장 유용한 기능 중 하나는 단축 구문입니다.
(하지만 Underscore는 이제 이 구문도 지원합니다)

 var characters = [ { 'name': 'barney', 'age': 36, 'blocked': false }, { 'name': 'fred', 'age': 40, 'blocked': true } ]; // Using "_.filter" callback shorthand _.filter(characters, { 'age': 36 }); // Using Underscore.js _.filter(characters, function(character) { return character.age === 36; } ); // → [{ 'name': 'barney', 'age': 36, 'blocked': false }]

( Lodash 문서 에서 가져옴)


neiker

저처럼 Underscore.js와 Lodash 간의 사용 차이점 목록을 예상했다면 Underscore.js에서 Lodash로 마이그레이션하기 위한 가이드가 있습니다.

다음은 후손을 위한 현재 상태입니다.

  • 밑줄 _.any 는 Lodash _.some
  • 밑줄 _.all 은 Lodash _.every
  • 밑줄 _.compose 는 Lodash _.flowRight
  • 밑줄 _.contains 는 Lodash _.includes
  • 밑줄 _.each false 를 반환하여 종료하는 것을 허용하지 않습니다.
  • 밑줄 _.findWhere 는 _.find _.find
  • 밑줄 _.flatten 은 기본적으로 깊지만 Lodash는 얕습니다.
  • Underscore _.groupBy (value, index, originalArray) 가 전달되는 반복자를 지원하지만 Lodash에서 _.groupBy에 대한 _.groupBy 는 단일 매개변수 (value) 만 전달됩니다.
  • 세 번째 매개변수가 undefined Underscore.js _.indexOf 는 Lodash _.indexOf
  • 세 번째 매개변수가 true Underscore.js _.indexOf 는 Lodash _.sortedIndexOf
  • 밑줄 _.indexBy 는 Lodash _.keyBy
  • 밑줄 _.invoke 는 Lodash _.invokeMap
  • 밑줄 _.mapObject 는 Lodash _.mapValues
  • 밑줄 _.max _.max_.maxBy 결합합니다.
  • 밑줄 _.min _.min_.minBy 결합합니다.
  • 밑줄 _.sample _.sample_.sampleSize 결합합니다.
  • 밑줄 _.object _.fromPairs_.zipObject 결합합니다.
  • 술어에 의한 밑줄 _.omit _.omitBy
  • 밑줄 _.pairs 는 Lodash _.toPairs
  • 술어에 의한 밑줄 _.pick _.pickBy
  • 밑줄 _.pluck 은 Lodash _.map
  • 밑줄 _.sortedIndex _.sortedIndex_.sortedIndexOf 결합합니다.
  • 밑줄 _.uniq 에 의해 iteratee Lodash입니다 _.uniqBy
  • 밑줄 _. _.where Lodash _.filter
  • 밑줄 _.isFinite Number.isFinite 와 일치하지 않습니다.
    (예: _.isFinite('1') 는 Underscore.js에서 true false 를 반환합니다.)
  • 밑줄 _.matches 속기는 심층 비교를 지원하지 않습니다.
    (예: _.filter(objects, { 'a': { 'b': 'c' } }) )
  • 밑줄 ≥ 1.7 & Lodash _.template 구문은 다음과 같습니다.
    _.template(string, option)(data)
  • Lodash _.memoize 캐시는 Map 과 같은 객체입니다.
  • Lodash는 지원하지 않습니다 context 에 찬성 많은 방법에 대한 인수를 _.bind
  • Lodash는 암시적 연결 , 지연 연결 및 바로 가기 융합을 지원합니다.
  • Lodash는 오버로드된 _.head , _.last , _.rest , & _.initial
    _.take , _.takeRight , _.drop_.dropRight
    (즉 _.head(array, 2)_.take(array, 2) 입니다)

Iest

John의 답변 외에도 Lodash(지금까지 Underscore.js에 대해 "나도 마찬가지"라고 생각했습니다)를 읽고 성능 테스트를 보고 소스 코드 및 블로그 게시물을 읽고 몇 가지 요점을 Lodash를 Underscore.js보다 훨씬 우수하게 만드는 것은 다음과 같습니다.

  1. 속도가 아니라 속도의 일관성 (?)

Underscore.js의 소스 코드를 살펴보면 Underscore.js가 많은 기능의 기본 구현을 대체한다는 것을 처음 몇 줄에서 볼 수 있습니다. 이상적인 세계에서는 이것이 더 나은 접근 방식이었을 것이지만 이 슬라이드에 제공된 성능 링크 중 일부를 살펴보면 이러한 '기본 구현'의 품질이 브라우저에 따라 많이 다르다는 결론을 도출하는 것이 어렵지 않습니다. 브라우저로. Firefox는 일부 기능에서 엄청나게 빠르며 일부 Chrome에서는 압도적입니다. (Internet Explorer가 지배하는 일부 시나리오가 있을 것이라고 생각합니다.) 여러 브라우저에서 성능 이 더 일관된 코드를 선호하는 것이 더 낫다고 생각합니다.

블로그 게시물을 더 일찍 읽고 그것을 믿기보다는 벤치마크 를 실행하여 스스로 판단하십시오. Chrome의 Array.every 와 같은 단순한 기본 기능에서도 Lodash가 Underscore.js보다 100-150% 더 빠르게 수행하는 것을 보고 깜짝 놀랐습니다!

  1. Lodash의 추가 기능 도 매우 유용합니다.
  2. Underscore.js의 코드에 대한 기여를 제안하는 Xananax의 높은 찬성 의견에 대해: 좋은 경쟁을 하는 것이 항상 더 좋으며, 이는 혁신을 계속할 뿐만 아니라 자신(또는 라이브러리)을 좋은 상태로 유지하도록 유도합니다.

다음은 Lodash 간의 차이점 목록이며 Underscore.js 빌드는 Underscore.js 프로젝트에 대한 드롭인 대체입니다.


kumarharsh

2014년에도 나는 여전히 내 주장이 유효하다고 생각합니다.

IMHO, 이 토론은 상당히 균형이 맞지 않았습니다. 앞서 언급한 블로그 게시물 인용:

Underscore, Valentine 및 wu와 같은 대부분의 JavaScript 유틸리티 라이브러리는 "기본 우선 이중 접근 방식"에 의존합니다. 이 접근 방식은 기본 구현을 선호하며 기본 동등한 기능이 지원되지 않는 경우에만 바닐라 JavaScript로 대체합니다. 그러나 jsPerf는 흥미로운 추세를 보여주었습니다. 배열 또는 배열과 유사한 컬렉션을 반복하는 가장 효율적인 방법은 기본 구현을 완전히 피하고 대신 간단한 루프를 선택하는 것입니다.

마치 "단순한 루프"와 "바닐라 자바스크립트"가 Array 또는 Object 메소드 구현보다 더 네이티브인 것처럼. 이런...

진실의 단일 소스가 있으면 확실히 좋겠지만, 그렇지 않습니다. 달리 말해도 바닐라 신은 없다, 내 사랑. 죄송합니다. 실제로 유지되는 유일한 가정은 모든 주요 브라우저에서 동일한 것을 서로 다르게 구현한다는 것을 알고 모든 주요 브라우저에서 잘 수행되는 것을 목표로 하는 JavaScript 코드를 작성하고 있다는 것입니다. 가볍게 말해서 대처해야 할 암캐입니다. 그러나 그것은 당신이 좋든 싫든 전제입니다.

아마도 여러분 모두는 지금 당장 초당 목록에서 850,000(Underscore.js) 대 2,500,000(Lodash) 반복 간의 차이를 실제로 볼 수 있도록 트위터 같은 성능이 필요한 대규모 프로젝트에서 작업하고 있을 것입니다!

나는 하나가 아닙니다. 내 말은, 성능 문제를 해결해야 하는 프로젝트에서 일했지만 Underscore.js나 Lodash에 의해 해결되지 않았거나 원인이 되지 않았습니다. 그리고 반복 가능한 루프(객체 또는 배열, 희소 여부!)에 대한 구현 및 성능(지금은 C++에 대해 이야기하고 있음)의 실제 차이점을 파악하지 않는 한 귀찮게 하지 않습니다. 이미 의견이 분분한 벤치마크 플랫폼의 결과를 기반으로 한 모든 주장.

하나의 "중세 루프 메서드가 더 좋고 영원히 수행되지 않는" 성직자가 다음과 같은 단순한 사실에 대해 자신의 방식을 주장할 수 없도록 Rhino 의 단일 업데이트만 필요합니다. 파이어폭스의 갑작스런 배열 방식은 그/그녀의 독단적인 두뇌싸움보다 훨씬 빠릅니다. 여러분의 런타임 환경을 속임으로써 런타임 환경을 속일 수는 없습니다! 홍보 할 때 생각하십시오 ...

당신의 유틸리티 벨트

... 다음번.

관련성을 유지하려면 다음을 수행하십시오.

  • 네이티브를 희생하지 않고 편의를 원한다면 Underscore.js를 사용하십시오.
  • 편리하고 확장된 기능 카탈로그(딥 카피 등)가 마음에 들고 즉각적인 성능이 절실히 필요하고 가장 중요한 것은 네이티브 API가 의견을 내자 마자 대안을 마련하는 데 신경 쓰지 않는 경우 Lodash를 사용하십시오. 해결 방법. 곧 일어날 일입니다. 기간.
  • 세 번째 솔루션도 있습니다. DIY! 환경을 파악하십시오. 불일치에 대해 알고 있습니다. 그들의 ( John-DavidJeremy 의) 코드를 읽으십시오. 일관성/호환성 레이어가 실제로 필요한 이유와 워크플로를 향상시키거나 애플리케이션의 성능을 향상시키는 이유를 설명할 수 없는 상태에서 이것 또는 저것을 사용하지 마십시오. 스스로 완벽하게 작성할 수 있는 간단한 폴리필로 요구 사항이 충족될 가능성이 매우 높습니다. 두 라이브러리 모두 약간의 설탕이 가미된 일반 바닐라입니다. 둘 다 누가 가장 달콤한 파이를 제공하는지 놓고 싸웁니다 . 그러나 나를 믿으십시오. 결국 둘 다 물로만 요리합니다. 바닐라 갓이 없으니 바닐라 교황도 있을 수 없겠죠?

귀하의 요구에 가장 적합한 접근 방식을 선택하십시오. 평소대로. 나는 언제든지 독단적인 런타임 치트보다 실제 구현에 대한 폴백을 선호하지만, 요즘에는 그마저도 취향의 문제인 것 같습니다. http://developer.mozilla.comhttp://caniuse.com 과 같은 양질의 리소스를 사용하면 문제 없이 사용할 수 있습니다.


Lukas Bünger

나는 여기에서 말한 대부분의 내용에 동의하지만 Underscore.js에 찬성하는 주장을 지적하고 싶습니다. 라이브러리의 크기입니다.

특히 모바일 장치에서 주로 사용하려는 앱이나 웹사이트를 개발하는 경우 결과 번들의 크기와 부팅 또는 다운로드 시간에 미치는 영향이 중요한 역할을 할 수 있습니다.

비교를 위해 이 크기는 Ionic serve를 실행한 후 source-map-explorer로 확인한 크기입니다.

 Lodash: 523 kB Underscore.js: 51.6 kB

BundlePhobia 를 사용하여 LodashUnderscore.js 의 현재 크기를 확인할 수 있습니다.


David Dal Busco

그것이 OP의 의미인지 확실하지 않지만 Underscore.js에서 Lodash로 마이그레이션할 때 염두에 두어야 할 문제 목록을 찾고 있었기 때문에 이 질문을 발견했습니다.

누군가가 그러한 차이점의 전체 목록과 함께 기사를 게시하면 정말 감사하겠습니다. 내가 어렵게 배운 것들(즉, 프로덕션에서 내 코드를 폭발적으로 만든 것들:/)부터 시작하겠습니다.

  • _.flatten 은 기본적으로 깊으며 얕게 만들기 위해 두 번째 인수로 true를 전달해야 합니다. Lodash에서는 기본적으로 얕고 두 번째 인수로 true를 전달하면 깊어집니다! :)
  • _.last 는 원하는 요소 수를 알려주는 두 번째 인수를 허용합니다. Lodash에는 그러한 옵션이 없습니다. .slice 하여 이를 에뮬레이트할 수 있습니다.
  • _.first (동일한 문제)
  • _.template 은 여러 가지 방법으로 사용할 수 있습니다. 그 중 하나는 템플릿 문자열과 데이터를 제공하고 HTML을 다시 가져오는 것입니다. Lodash에서는 데이터를 제공해야 하는 함수를 받습니다.
  • _(something).map(foo) 는 Underscore.js에서 작동하지만 Lodash에서는 _.map(something,foo) 로 다시 작성해야 했습니다. 아마도 그것은 TypeScript 였을 것입니다.

qbolec

Ben McCormick의 Underscore vs Lo-Dash 는 두 가지를 비교한 최신 기사입니다.

  1. Lodash의 API는 Underscore.js의 상위 집합입니다.
  1. 후드 아래에서 Lodash는 완전히 다시 작성되었습니다.
  1. Lodash는 Underscore.js보다 확실히 느리지 않습니다.
  1. Lodash는 무엇을 추가했습니까?
  • 사용성 개선
  • 추가 기능
  • 성능 향상
  • 연결을 위한 약식 구문
  • 필요한 것만 사용하는 맞춤형 빌드
  • 시맨틱 버전 관리 및 100% 코드 적용 범위

pilau

나는 단지 나에게 중요한 한 가지 차이점을 발견했습니다. Underscore.js와 호환되지 않는 _.extend() 버전은 클래스 수준 정의 속성이나 메서드를 복사하지 않습니다.

나는 이것을 보여주는 CoffeeScript 에서 Jasmine 테스트를 만들었습니다.

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

다행히도 lodash.underscore.js 는 Underscore.js의 모든 것을 복사하는 동작을 유지합니다. 제 상황에서는 이것이 원하는 동작이었습니다.


Craig Walker

Lodash은 가지고있다 _.mapValues() Underscore.js의 동일있는 _.mapObject() .


Art

대부분 Underscore.js는 Lodash의 하위 집합입니다.

때때로 Underscore.js에는 MapObject와 같이 Lodash에 없는 멋진 기능이 있습니다. 이것은 내 프로젝트 개발에 많은 시간을 절약했습니다.


rashadb

그들은 Lodash 가 인수하면서 꽤 비슷합니다 ...

둘 다 JavaScript의 유틸리티 세계를 사용하는 유틸리티 라이브러리입니다...

Lodash 는 이제 더 정기적으로 업데이트되고 있으므로 최신 프로젝트에서 더 많이 사용되는 것 같습니다...

또한 Lodash 는 몇 KB 더 가벼운 것 같습니다 ...

둘 다 좋은 API와 문서를 가지고 있지만 Lodash 가 더 낫다고 생각합니다...

다음은 배열의 첫 번째 값을 얻기 위한 각 문서 항목에 대한 스크린샷입니다...

밑줄.js:

밑줄.js

로다쉬:

로다쉬

상황이 수시로 업데이트 될 수 있으므로 웹 사이트도 확인하십시오 ...

로다쉬

밑줄.js


Alireza

출처 : http:www.stackoverflow.com/questions/13789618/differences-between-lodash-and-underscore-js

반응형