ES6 / Typescript에서 화살표 함수와 함께 _ (밑줄) 변수 사용


119

Angular 예제에서이 구조를 보았고 이것이 왜 선택되었는지 궁금합니다.

_ => console.log('Not using any parameters');

나는 변수 _는 상관 없음 / 사용하지 않음을 의미하지만 유일한 변수이기 때문에 _ 사용을 선호하는 이유가 있음을 이해합니다.

() => console.log('Not using any parameters');

확실히 이것은 입력 할 문자가 한 글자 적을 수 없습니다. () 구문은 내 의견으로는 의도를 더 잘 전달하고 유형별로 더 구체적입니다. 그렇지 않으면 첫 번째 예제가 다음과 같아야한다고 생각하기 때문입니다.

(_: any) => console.log('Not using any parameters');

중요한 경우, 이것이 사용 된 컨텍스트였습니다.

submit(query: string): void {
    this.router.navigate(['search'], { queryParams: { query: query } })
      .then(_ => this.search());
}


1
사용되지 않는 매개 변수의 유형 또는 유형 특이성에 대해 어떻게 걱정할 수 있습니까?

3
저는 C ++ 개발자이기 때문에 항상 타입 특이성에 대해 걱정하고 있습니다. :-).
중단

6
개인적으로, _ => 패턴은 괄호의 수를 줄여서 읽기 쉽게 만듭니다 : doStuff (). then (() => action ()) vs doStuff (). then (_ => action ()).
Damien Golding

답변:


93

(이 여기에 사용 된 이유를 가능하게하고)이 스타일을 사용할 수 있습니다 이유는 즉 _이상의 문자 짧다 ().

선택적 괄호는 선택적 중괄호 와 동일한 스타일 문제에 속합니다 . 이것은 대부분의 취향과 코드 스타일의 문제이지만 일관성 때문에 여기서는 장황함이 선호됩니다.

화살표 함수는 괄호가없는 단일 매개 변수를 허용하지만, 0, 단일 구조화, 단일 나머지 및 다중 매개 변수와 일치하지 않습니다.

let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };

밑줄이있는 매개 변수에 대한 is declared but never used오류 가 TypeScript 2.0에서 수정 되었지만 linter 또는 IDE에서 경고를 _트리거 할 수도 있습니다 unused variable/parameter. 이것은 이것을하는 것에 대한 상당한 논쟁입니다.

_무시 된 매개 변수에 대해 일반적으로 사용할 수 있습니다 (다른 답변이 이미 설명했듯이). 이것이 허용 가능한 것으로 간주 될 수 있지만이 습관은 _Underscore / Lodash 네임 스페이스 와 충돌을 일으킬 수 있으며 무시 된 매개 변수가 여러 개있을 때 혼란스러워 보입니다. 이러한 이유로 적절하게 명명 된 밑줄이있는 매개 변수 (TS 2.0에서 지원됨)를 사용하는 것이 유익하고, 함수 서명과 매개 변수가 무시 된 것으로 표시되는 이유를 파악하는 데 드는 시간을 절약 할 수 있습니다 (이는 _매개 변수 의 목적을 바로 가기 로 무시 함).

let fn = (param1, _unusedParam2, param3) => { ... };

위에 나열된 이유 때문에 저는 개인적으로 _ => { ... }코드 스타일을 피해야 할 나쁜 톤이라고 생각합니다.


1
한 문자 더 짧지 만 대부분의 IDE에서 키 누르는 횟수는 동일 (합니다 ). 개인적 p으로 매개 변수에 사용하는 것을 선호 합니다. 성능 문제가 있는지도 궁금합니다
Mojimi

68

()구문은 의도 나은 이럴 전달하고 또한 더 타입 고유의 것입니다

정확히. ()함수가 인수를 기대하지 않고 매개 변수를 선언하지 않는다고 말합니다. 함수 .length는 0입니다.

를 사용 _하면 함수에 하나의 인수가 전달되지만 신경 쓰지 않는다는 것을 명시 적으로 나타냅니다. 함수 .length는 1이며 일부 프레임 워크에서는 중요 할 수 있습니다.

따라서 유형 관점에서 보면 더 정확한 작업 일 수 있습니다 (특히 입력하지 않고 any라고 말하면 _: Event). 그리고 당신이 말했듯이, 입력하기가 한 문자가 적기 때문에 일부 키보드에서 접근하기가 더 쉽습니다.


6
내 첫 번째 생각은 _이 함수를 이해하려고 할 때 고려해야 할 인수가 없다는 것을 관례 상 명백하게 만든다는 것입니다. ()를 사용하면 _를 사용할 수 있는지 코드를 스캔 할 필요가 없습니다 (이는 규칙을 위반 함). 그러나 당신은 함수에 전달 된 값이 있다는 문서화의 가치를 고려하기 위해 눈을 뜨고, 그렇지 않으면 항상 분명하지는 않을 것입니다.
중단

방금 내 코드가 사용되지 않은 _화살표 함수 변수 로 가득 차 있다는 것을 깨달았습니다. 사용 하는 것과 비교하여 성능 차이가 있는지 궁금합니다()
Mojimi

24

그런 것 같아요 _ =>그냥 사용 () =>하기 때문에 _이 JS처럼 단지 생략 매개 변수에 허용되지 않는 다른 언어에서 일반적입니다.

_ Go에서 인기가 있으며 Dart에서도 매개 변수가 무시되고 내가 알지 못하는 다른 매개 변수를 나타내는 데 사용됩니다.


4
파이썬도이 규칙을 따른다고 생각합니다.
Jaime RGP

7
이 사용법 _은 아마도 ML과 Haskell과 같은 기능적 언어에서 빌 렸을 것인데, Python의 발명 (Go, Dart 또는 TypeScript는 제외)보다 오래 전부터 사용되었습니다.
ruakh

1
또한 루비는 그 (하지 po-ru.com/diary/rubys-magic-underscore (ML 가족에 의해 영향을 다른 언어)) 및 F 번호도
MARIUSZ Pawelski

Scala는 밑줄을 좋아합니다 ( includehelp.com/scala/use-of-underscore-in-scala.aspx ). Scala가 밑줄이있는 익명 유형으로 수행 한 작업 이후에 더 많은 언어가 사용되었습니다.
Sam

나는 Scala가 다른 언어에서도 그것을 취했다고 생각합니다. 70 년대에 이미 존재하지 않았던 프로그래밍 언어에는 거의 아무것도 없습니다. : D 대체로 재료를 결합하는 새로운 방법 일뿐입니다.
Günter Zöchbauer

11

두 가지 사용을 구별하는 것이 가능하며 일부 프레임 워크에서는이를 사용하여 서로 다른 유형의 콜백을 나타냅니다. 예를 들어 노드 익스프레스 프레임 워크는 미들웨어 유형을 구분하기 위해 이것을 사용한다고 생각합니다. 예를 들어 오류 처리기는 3 개의 인수를 사용하고 라우팅은 2 개를 사용합니다.

이러한 차별화는 아래 예와 같습니다.

const f1 = () => { } // A function taking no arguments
const f2 = _ => { }  // A function with one argument that doesn't use it

function h(ff) { 
  if (ff.length === 0) {
    console.log("No argument function - calling directly");
    ff();
  } else if (ff.length === 1) {
    console.log("Single argument function - calling with 1");
    ff(1);
  }
}

h(f1);
h(f2);


1
이것은 Bergi의 답변을 기반으로하지만 다른 사람의 게시물에 기꺼이하는 것보다 예제를 추가하는 것이 조금 더 편집하는 것이라고 생각했습니다.
Michael Anderson

0

글을 썼을 때 나는 _화살표 함수를 사용하지 않고 화살표 함수를 만드는 유일한 방법 이라는 인상 ()을 받았기 때문에 사용하면 _약간의 이점이있을 수 있다고 믿게 되었지만 내가 틀렸다. @Halt는 주석에서 다른 변수처럼 작동하며 특수한 언어 구조가 아니라는 것을 확인했습니다.


나는 내가 어디서도 언급하지 않은 것을 직접 테스트하면서 이러한 밑줄 화살표 기능에 대해 깨달은 것을 한 가지 더 언급하고 싶습니다. 당신은 수있는 매개 변수로 함수에 밑줄을 사용하여 그 이후이 아마 것은 아니다 사용이되지 않는 매개 변수를 표현하기로했다 있지만. 명확성을 위해 나는 이것을 이런 식으로 사용하는 것을 권장하지 않습니다. 그러나 codegolf 와 같은 것을 아는 것이 유용 할 수 있습니다 . 가장 짧은 코드를 작성하는 문제 (는없이 아무 문자 나 사용할 수 있습니다 ()). 라이브러리가 이것을 사용하는 실제 사용 사례를 상상할 수 있으며 해당 기능을 의도하지 않았더라도 사용해야합니다.

예:

// simple number doubling function
f = _=> {
    _ = _ * 2;
    return _;
}

console.log(f(2)); // returns 4
console.log(f(10)); // returns 20

Chrome 콘솔 버전 76.0.3809.132 (공식 빌드) (64 비트)로 테스트되었습니다.


1
밑줄 '_'은 특수한 언어 구조가 아니라 합법적 인 변수 이름이며 관례 상 특별한 의미 만 부여됩니다. 사용하지 않는 매개 변수에 대한 Linter 경고는 밑줄 접두사를 사용하여 음소거 할 수 있습니다. _ 그 자체가 미사용이라고 말하는 가장 짧은 방법 인 것 같습니다.
중단

@Halt 명확하게 해주셔서 감사합니다. ()이 글을 작성하기 전에는 화살표 기능을 만들 수 있다는 사실을 몰랐고, 이것이 _유일한 방법 이라고 생각했기 때문에 이것을 지적하기로 결정했습니다. 이를 염두에두고 일반 캐릭터를 사용할 수 있기 때문에 골프에도 사용하는 것이 특별한 것은 아닙니다. 당신이 말했듯이 단순히 규칙을 따르는 데 더 잘 사용됩니다.
Matsyir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.