The Bong'

javascript에서 처음보면 난해한 것들

2022-07-16 at javascript category

현재 재직 중인 회사에서는 nest.js를 사용하는데, 아무래도 전에는 계속 JAVA를 주로 해왔다보니 처음 봤을 때 이게 뭐지? 싶은 것들을 정리해보려 한다.

via GIPHY

  • plus sign +

const result = db.select;
const response = {
  name: result.name,
  age: +result.age
}

위와 같이 연산을 하는게 아닌 곳에 갑자기 특수문자 + 가 와 있는 경우가 있는데, 이는 아래와 같다.

const result = db.select;
const response = {
  name: result.name,
  age: Number.parseInt(result.age)
}

  • double question mark ??

javascript는 아니고 typescript이다. env설정값을 갖고 오기 위해서는 더 간결하게 작성할 수 있다.

const env = (process.env.NODE_ENV) ? process.env.NODE_ENV : 'dev'
const env = process.env.NODE_ENV ?? 'dev'
// 위 두개의 코드는 같다

정확한 명칭은 Nullish Coalescing이라고 하여 typescript 3.7소개 되었다.


  • underscore _

여러가지로 쓰인다.
그러나 #처럼 특정 문법에 속하는것이 아니다

대부분 convention이다.

#이 정식적으로 private을 나타내게 되기까지는 꼼수로 private을 나타내기 위하여 쓰였다.

const _name; // private으로 봐주겠니?

예약어때문에 문제가 되는경우에도 쓰인다.

const dbResult = [
    {break: 10, id: 1},
    {break: 20, id: 2},
    {break: 30, id: 3}
];

dbResult.map(({break}) => break);
// VM310:1 Uncaught SyntaxError: Unexpected token 'break'

const breaktimes = dbResult.map(({break: break_}) => break_)
                           .reduce((sum, curr) => sum + curr);

예를 들면, 종업원들마다 휴식시간에 차이가 있고, 총 휴식시간이 얼마인지 구하고 싶을 때, 위처럼 break는 javascript의 예약어이기 때문에 문제가 된다. 따라서 이를 다른 변수명으로 바꿔주는데, 의미는 그대로 갖고 가고 싶을때 기존 변수명_로 나타내줄 수 있다.


  • curying

커링. 인터넷에 다른 글들을 보면, 대부분의 볼 수 있는 곱셈예제

function multiply(a, b, c) {
  return a * b * c;
}

function multipliyCurying(a) {
  return function (b) {
    return function (c)  {
      return a * b * c;
    }
  }
}

console.log(multipliyCurying(1)(2)(3)); // 6

위에까지만 보면 이해가 잘 된다.
그러나 arrow를 넣고, return이 한줄이라서 return을 생략하는 경우 이해를 못하는 경우가 있을 수 있는데...

const multipliyCurying = (a) => (b) => (c) => a * b * c;
console.log(multipliyCurying(1)(2)(3)); // 6

위의 코드와 첫 예시의 코드는 같다.
기존의 첫 예시에 arrow를 적용하면,

const multipliyCurying = (a) => (b) => (c) => {
      return a * b * c;
};

위에서 return이 한줄이니 {, return을 지워주면 같은 코드이다.


  • asterisk *

Generator

function* fibonacci() {
  let [a, b] = [0, 1]
  while (true) {
    yield a;
    [a, b] = [b, a + b]
  }
}

const fib = fibonacci();
[...Array(10).keys()].forEach(value => console.log(fib.next().value));

역시 특수문자가 오는데, *는 제네레이터를 의미한다. 그런데 이게

function* fibonacci() {
function *fibonacci() {

위처럼 마음데로 function뒤에 오거나 function의 이름 앞에 오거나 한다.
둘 중 하나는 문제가 있길 바라지만, 둘 다 가능하다.

모던 JavaScript 튜토리얼에서는 아래와 같이 가이드하고 있다.

둘 다 맞습니다.
그런데 *는 제너레이터 함수를 나타내므로 대개는 첫 번째 문법이 선호됩니다. *는 종류를 나타내는 것이지 이름을 나타내는 것이 아니기 때문입니다. 그러므로 *는 function에 붙이도록 합시다.


  • double asterisk **

Math.pow와 같다. 아래의 코드는 모두 8의 값을 갖는다.

const powed = Math.pow(2, 3);
const doubleAsterisk = 2 ** 3;

  • hashtag #

private을 나타내는 문법


Bong

Personal blog by Bong.

Sr. Developer / Interested in Functional JAVA, AWS, SQL Tunning