게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌49 - JavaScript - 8년 전 등록 / 6년 전 수정

Syntactic Sugar

보호 연산자, 기본값 연산자 등

안녕하세요. 이번 시간에는 자바스크립트의 syntactic sugar에 대해 알아보겠습니다. 제목은 자바스크립트 가지고 놀기라고 지었는데요. 이번 시간의 여러 코드들을 알아두면 코딩하는 데 많은 도움이 될 겁니다. (도움이 되었으면 좋겠습니다...) 직관적이지는 않지만 코드의 양을 줄여줍니다. 이런 것들을 syntactic sugar라고 부르는 데요. 문법적인 설탕이란 뜻으로, 프로그래밍을 할 때 문법적으로 알아두면 편한 것들을 말합니다.

실제로 ES2015에서는 여러가지 syntactic sugar가 추가되었다고 평가받는데요. 그 예로 class가 있습니다. 자바스크립트의 생성자, 상속과 유사하지만 다른 언어 사용자의 진입장벽을 낮추기 위해 도입되었습니다. 또한 객체 분해(Desturcture)나 spread도 syntactic sugar라고 여겨지고 있죠.

보호 연산과 기본값 연산

먼저 알아볼 것은 논리 연산자입니다. 엄청 오래전에 배웠죠? &&||가 있습니다. 이 둘은 true나 false를 구분할 때 쓰이지만, 다른 용도로도 많이 쓰입니다.

var a;
if (b) {
  a = b;  
} else if (c) {
  a = c;
} else {
  a = d;
}

이 긴 구문을 다음과 같이 줄일 수 있습니다. 바로 false 성질을 띄는 것(undefined, null, 0, '', false, NaN, document.all)들과 ||의 성질을 이용한 건데요. b가 아니면 c, c도 아니면 d까지 확인합니다. 결국 b, c가 모두 아니면 a는 d가 되는거죠.

var a = b || c || d;

다음은 && 예제입니다. ||과는 반대로 b도 있고 c도 있으면 a = d가 됩니다. b는 있는데 c가 없으면 a = c가 되고요. b가 없으면 a = b가 됩니다.

var a = b;
if (b) {
  a = c;
  if (c) {
    a = d;
  }
}
var a = b && c && d;

||는 값이 false 성질을 띄지 않을 때까지 다음 것을 찾고, &&는 값이 true 성질을 띄지 않을 때까지 다음 것을 찾습니다. ||는 주로 기본값(default)을 정할 때 많이 쓰입니다. 예를 들면 다음과 같이 사용자가 함수의 인자로 아무 것도 안 넣어주었을 때 기본으로 []가 설정됩니다.

function setting(option) {
  var result = option || [];
  return console.log(result);
}
setting([1, 2, 3]); // [1, 2, 3]
setting(); // []

다음과 같이 해도 default를 표현할 수 있습니다.

var result = option ? option : [];

&&는 필수 조건을 의미할 때 주로 쓰입니다.

function condition(cond) {
  var result = cond && 'hello';
  return console.log(result);
}
condition(true); // 'hello';
condition(); // undefined

또는 객체 안의 속성에 안전하게 접근하기 위해 사용됩니다. 보호 연산이 이런 의미입니다. cannot read property of undefined 에러를 피하기 위해 사용되죠.

var a = object && object.inner && object.deeper

시간 변환

다음과 같이 하면 현재 시간을 밀리초단위 숫자로 변환할 수 있습니다. 빠른 시간 계산 때 유용합니다. 뭔가 표준같지 않다고 느껴지면 new Date().valueOf() 또는 new Date().getTime()하면 됩니다.

+new Date(); // 1970년 이후로 지나간 밀리초

불린 변환

빠르게 해당 값이 true인지 false인지를 체크할 수도 있습니다. 느낌표 두개를 사용하는 겁니다.

var a = [];
var b = NaN;
!!a; // true
!!b; // false

다차원 배열 생성

자바스크립트에서 재귀를 통해 다차원 배열을 쉽게 만드는 방법입니다. 2x3x4 배열을 만듭니다.

var array = [];
for (var i = 0; i < 2; i++) {
  array[i] = [];
  for (var j = 0; j < 3; j++) {
    array[i][j] = [];
    for (var k = 0; k < 4; k++) {
      array[i][j][k] = [];
    }
  }
}

기존에는 위처럼 했다면, 이제는 아래처럼 하면 됩니다.

function createArray(length) {
  var arr = new Array(length || 0),
    i = length;
  if (arguments.length > 1) {
    var args = Array.prototype.slice.call(arguments, 1);
    while(i--) arr[length-1 - i] = createArray.apply(this, args);
  }
  return arr;
}
var arr = createArray(2,3,4);

앞으로도 괜찮다 싶은 유용한 문법이 있으면 계속 추가하도록 하겠습니다!

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

6개의 댓글이 있습니다.
일 년 전
다차원 배열을 생성할 때 fakearray라는 Object를 이용하더라고요.
자바스크립트에서는 배열이 배열의 프로퍼티를 가진 객체이기 때문에
Array.from({length: int}, () => Array(int2).fill(0)); 따위의 코드처럼 사용하는 것 같습니다.
4년 전
안녕하세요! 마지막에 다차원배열 생성하는 예제에서 createArray.apply 대신 createArray(args) 를 하면 배열자체가 인자로 전달되어버리고, createArray.apply(this, args) 를 하면 배열의 첫번째 값만 인자로 전달되는 특징이 있더라구요. this의 용법이 context를 바꾼다는 의미는 알겠는데.. 결과적으로 왜 저런 현상이 생기는지는 알기가 어렵네요 ㅠ 허접한 질문 들어주셔서 감사합니다
4년 전
함수.apply(this값, 배열)는 함수(요소1, 요소2, 요소3, ...)과 같습니다. createArray는 어차피 매개변수를 하나만 받는 함수이므로 요소1만 전달됩니다.
4년 전

var arr1 = createArray(2);
length: 2

길이가 2인 1차원 배열이 생성되고 완료되고 (arguments.length>1 을 만족하지 않아서)

var arr2 = createArray(2, 3);
length: 2
arguments: [object Arguments]

length:3 이 두 번 반복 (길이가 3인 1차원 배열이 두 번 생성됨)

길이가 3인 1차원 배열을 arr의 각 원소로 넣으면
arr[[길이가 3인 1차원배열], [길이가 3인 1차원 배열]]

arr[length-1 - i] 이건 원래 1차원 공간인 메모리공간을 2차원인 것 처럼 사용할 수 있게 해주는 건데 좀 더 자세히 뜯어봐야겠네요.

1. length-1 은 배열의 인덱스가 0부터 시작해서 그런 거 같고
2. length-1 - i 이건 행을 구분해주기 위해서인 거 같네요.

감사합니다.
4년 전
안녕하세요?

2x3짜리 배열 4겹!!

마지막 2x3x4 다차원 배열 생성하는 방법 순서대로 생각해보면


1. createArray에서 배열 길이를 받아서 arr배열을 만들고, length가 없으면 배열길이 0

2, 숨겨진 arguments 속성과 call로 args배열을 만듬
3. createArray에서 apply 메서드(array와 a가 같은 걸로 외우면 편함)를 이용해서 args배열을 이용해서 배열을 만들어서
4. arr배열의 원소로 넣음
5. 만들어진 arr배열을 리턴

createArray(2, 3, 4);
length : 2
length : 3
length : 4
length : 3
length : 4

후... 다시 복습하고 와야겠네요.

근데 var arr = new Array(length || 0) \u003c--- 여기서
배열의 길이의 기본값으로 0을 줬는데 배열길이가 0인 배열이 있을 수 있나요?



감사합니다.
4년 전
배열에 아무것도 안 넣으면 길이가 0입니다
6년 전
(b는 있는데 c가 없으면 a = c가 되고요.) \u003c- 이 구문이 두번 반복되는데 의도하신건가요?
6년 전
아 오타입니다. 감사합니다.
7년 전
"&&는 ||과는 반대로 b도 있고 c도 있으면 c가 됩니다." 이 부분 혹시 d 가 되는 것 아닌가요?
7년 전
설명이 모호한 부분이 있어 수정했습니다! 감사합니다.