최근 수정 시각 : 2025-12-13 16:49:35

언더스코어

Underscore.js에서 넘어옴

파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
'''언더스코어'''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 밑줄 문자}}}에 대한 내용은 [[_]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[_#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[_#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html 음악가}}}에 대한 내용은 [[underscores]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[underscores#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[underscores#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
밑줄 문자: }}}[[_]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[_#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[_#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
음악가: }}}[[underscores]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[underscores#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[underscores#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}


1. 개요2. 용도3. 예시4. 파생 라이브러리


홈페이지

1. 개요

JavaScript 라이브러리. jQueryHTML 문서를 조작하거나 DOM 이벤트를 처리할 목적으로 설계됐다면 언더스코어 라이브러리는 자바스크립트를 LISP처럼 사용할 수 있게 만들어주는 라이브러리의 집합이다.

2. 용도

자바스크립트라는 언어 기반 위에서 동작하는 라이브러리이기 때문에 자바스크립트의 기본 동작을 바꿔버리는 놈은 아니다. 하지만 이 놈을 사용하려면 기본적으로 프로그래밍 패러다임을 객체 지향적 사고에서 함수형 프로그래밍 개념으로 전환해야 한다. 따라서 자주 사용되는 라이브러리는 아니다.

이 라이브러리는 객체나 리스트를 해석하는 고차 함수를 지원한다. 루프문을 사용하지 않고 LISP같이 리스트 해석 함수를 사용해 데이터를 처리할 수 있다. 물론 라이브러리로 한 겹 더 감싸진 형태라 직접 루프를 돌면서 데이터를 해석하는 것보다는 성능 면에서는 느리다. 하지만 이것의 진가는 해당 라이브러리의 API문서를 보면 알 수 있다.

3. 예시

https://lodash.com/docs 여기서 해당 API 목록을 예제와 함께 볼 수 있는데 리스트나 객체를 다룰 때 빈번히 사용되는 패턴들을 일반화한 함수들을 제공하는 것을 볼 수 있다. API문서가 보이는 창에는 기본적으로 언더스코어 라이브러리가 로드돼있기 때문에 F12 눌러서 나오는 자바스크립트 콘솔에 해당 명령들을 입력하면 API를 바로 실험해볼 수도 있다.

이게 도대체 무슨 쓸모가 있는지 잘 모르겠다면 아래의 일을 처리할 수 있는 함수를 생각해보자.
어떤 객체의 리스트를 특정 키 값을 기준으로 정렬한 새로운 리스트를 반환

SQL이라면 간단하다. 그냥 아래의 질의 명령을 데이터베이스에 내리면 되니까.
SELECT * FROM some_table ORDER BY 'key';

하지만 자바스크립트로 짜려면 궁리를 많이 해야 할 뿐만 아니라, 여러 Case 를 고려해야하기 때문에 코드 자체가 더러워질 수밖에 없다. 하지만 언더스코어 라이브러리에서는 이걸로 충분하다.
#!syntax javascript
// arr 리스트의 객체를 time프로퍼티에 대해서 정렬
var sorted_arr = _.sortBy(arr, "time");

그리고 이런 식으로 정렬된 배열에 대해 이진 탐색을 하려고 하면 어떨까?
#!syntax javascript
var finder_index = _(arr).pluck("time").indexOf(current_time, true);

-1 부터 1 사이의 부동소숫점 값으로 된 배열의 절댓값을 취해서 다 더하는 건?
#!syntax javascript
var abs_sigma = _([-1,0,1]).map(Math.abs).sum();

더하는 게 아니라 곱하는 거라면? 곱셈은 sum 이딴 거 없는데?
#!syntax javascript
var abs_pi = _([-2,3,4]).map(Math.abs).reduce(_.multiply, 1);
위의 답은 -24가 아니라 24다. 절댓값을 곱했으니까.

두 리스트의 차이값으로 된 리스트를 얻고 싶다?
#!syntax javascript
var diff_list = _.zipWith([1,2,3,4], [5,6,7,8], _.subtract);

복잡한 예제로, 단어 빈도수 세기 프로그램을 만들어보자.
#!syntax javascript
var words = {};
_.each(_.words("ade ball cat drama ade ade drama"), function(a) {words[a] = _.add(words[a], 1); });
두 줄이나 돼서 복잡하다. -

또는 변수값 변화 따위 없는 순수한 함수형으로 만들고 싶은 경우
#!syntax javascript
var words = _(_.words("ade ball cat drama ade ade drama")).groupBy().mapValues("length").value();
더 짧은게 함정

또는 아예 (lodash 가 제공하는) fp 라이브러리를 써서 아래와 같이 할 수도 있다.
#!syntax javascript
var words = fp.compose(fp.mapValues("length"), fp.groupBy(fp.identity), fp.words)("ade ball cat drama ade ade drama");

위에것 전부 Lo-Dash의 예제다. 하지만 언더스코어도 거의 호환된다. 이외의 예제들은 위의 사이트들을 방문해 보자.

4. 파생 라이브러리

  • Lo-Dash - 성능 개선 및 언더스코어 확장 라이브러리. 언더스코어 라이브러리를 대체할 목적으로 만들어졌기 때문에 거의 모든 API가 호환되며, lodash에만 추가된 기능도 많다. 또, 상당수의 코드가 최적화되어 속도가 빠른 장점이 있다.#