본문으로 건너뛰기

참 같은 값과 ??

자바스크립트 목차조건레슨 18 / 76

목차

조건 자리에 true·false가 아닌 값이 오면 자바스크립트는 그 값을 참이나 거짓으로 칩니다. 거짓으로 치는 값을 거짓 같은 값(falsy), 나머지를 참 같은 값(truthy)이라고 부릅니다. ?? 연산자는 값이 null이나 undefined일 때만 기본값을 고릅니다.

앞 레슨에서 x === 1 || 2의 조건이 늘 참이었던 것은 2가 참 같은 값이기 때문입니다. 이 규칙은 '비었으면 이 값'처럼 기본값을 고를 때 쓰이는데, 0이나 빈 문자열까지 지워 버리는 함정이 있습니다.

5단계 중 1단계. 1번 줄: count를 0에 붙입니다.

1조건 자리의 값은 참이나 거짓으로 친다

if의 조건 자리나 ! 연산자 뒤에 수·문자열 같은 값이 오면, 자바스크립트는 그 값을 참이나 거짓으로 칩니다. 거짓 같은 값은 아래 여덟이고, 나머지 값은 모두 참 같은 값입니다.

거짓 같은 값뜻
false거짓
0수 0
''빈 문자열(글자가 하나도 없는 문자열)
NaN수로 나타낼 수 없는 계산 결과
null값이 없다고 일부러 적은 값
undefined아직 아무 값도 정해지지 않은 값(없는 자리의 글자 등)
-0 · 0n이 과목에서는 쓰지 않는 수

글자가 하나라도 있는 문자열은 '0'이나 빈칸 하나 ' '이어도 참 같은 값입니다.

const memo = '';
if (memo) {
  console.log(memo);
} else {
  console.log('메모 없음');
}
실행 결과
메모 없음

memo는 빈 문자열이라 거짓 같은 값이고, else 덩어리가 실행됩니다.

2비었으면 다른 값을 고르는 ||

앞 레슨에서 본 대로 || 연산자는 왼쪽이 참 같은 값이면 왼쪽을, 거짓 같은 값이면 오른쪽 값을 돌려줍니다. 그래서 '비었으면 이 값'을 고를 때 씁니다.

const name = '';
console.log(name || '손님');
실행 결과
손님

입력 칸에 이름을 넣지 않아 빈 문자열이면 오른쪽 '손님'을 돌려줍니다. 이렇게 값이 없을 때 대신 쓰는 값을 기본값(default value)이라고 합니다.

30과 빈 문자열까지 지우는 ||

재고를 셌더니 0개입니다. 아래 코드는 무엇을 찍을까요? 답을 정한 뒤 펼쳐 보세요.

const stock = 0;
console.log(stock || '모름');
실행 결과 보기
실행 결과
모름

예상과 다르면 그곳이 배울 곳입니다. 0은 거짓 같은 값이라 || 연산자가 오른쪽 '모름'을 돌려줍니다. 0개라는 제 값이 기본값에 지워졌습니다.

|| 연산자는 0·빈 문자열처럼 제 값일 수 있는 것도 '없음'으로 칩니다. 0이나 빈 문자열이 뜻 있는 값이면 다음 절의 ?? 연산자를 씁니다.

4null과 undefined일 때만 고르는 ??

?? 연산자(자료에 따라 널 병합 연산자라고도 부릅니다)는 왼쪽이 null이나 undefined일 때만 오른쪽 값을 돌려주고, 그 밖에는 왼쪽 값을 그대로 둡니다.

const stock = 0;
console.log(stock ?? '모름');
const word = 'cat';
console.log(word[5] ?? '없음');
실행 결과
0
없음

0은 null·undefined가 아니라서 0이 그대로 남습니다. word[5]는 없는 자리라 undefined이고, 그래서 '없음'을 돌려줍니다. 두 연산자를 견주면 이렇습니다. a가 왼쪽 값, b가 기본값입니다.

왼쪽 값 aa || ba ?? b
0b0
''b''
null · undefinedbb
'커피'(참 같은 값)'커피''커피'

예제

카페 주문 화면의 세 줄을 찍습니다. 주문이 비었는지, 메모가 있는지, 재고가 몇 개인지를 저마다 맞는 방법으로 묻습니다.

const orders = [];
const memo = '';
const stock = 0;
if (orders.length === 0) {
  console.log('주문 없음');
}
console.log(memo || '메모 없음');
console.log(stock ?? '모름');
실행 결과
주문 없음
메모 없음
0
  • orders는 7단원에서 배울 배열이고, []는 빈 배열입니다. 배열이 비었는지는 담긴 값의 수 .length로 묻습니다(4번 줄).
  • 빈 메모는 '없음'으로 쳐도 되니 || 연산자로 기본값을 고릅니다(7번 줄).
  • 재고 0은 제 값이니 ?? 연산자로 undefined·null일 때만 기본값을 고릅니다(8번 줄).

과목 끝의 할 일 앱에서도 빈 배열은 참 같은 값이라 목록이 비었는지는 todos.length === 0으로 묻고, 비었으면 안내 글을 보입니다.

자주 틀리는 곳

틀린 생각: 빈 배열은 거짓 같은 값이다.

비어 있으니 '없음'처럼 보입니다. 그러나 아래 코드는 주문이 하나도 없는데 주문 있음을 찍습니다.

const orders = [];
if (orders) {
  console.log('주문 있음');
} else {
  console.log('주문 없음');
}
실행 결과
주문 있음

빈 배열은 거짓 같은 값 여덟에 들지 않아 참 같은 값입니다.

맞는 규칙: 배열은 비어 있어도 참 같은 값입니다. 비었는지는 orders.length === 0처럼 길이로 묻습니다.

틀린 생각: '0'이나 빈칸 하나 ' '도 거짓 같은 값이다.

0과 빈 문자열이 거짓 같은 값이니 닮은 두 값도 그럴 것 같습니다. 그러나 둘 다 글자가 하나 있는 문자열입니다.

const qty = '0';
const memo = ' ';
if (qty && memo) {
  console.log('둘 다 참');
}
실행 결과
둘 다 참

맞는 규칙: 문자열은 글자가 하나도 없을 때만 거짓 같은 값입니다. 입력 칸에서 온 글자는 trim()으로 빈칸을 떼거나 Number()로 수를 만든 뒤 묻습니다.

틀린 생각: || 연산자로 고른 기본값은 값이 없을 때만 쓰인다.

'비었으면 1잔'처럼 읽힙니다. 그러나 0잔을 주문했는데 1잔이 됩니다.

const qty = 0;
console.log(qty || 1);
console.log(qty ?? 1);
실행 결과
1
0

맞는 규칙: || 연산자는 거짓 같은 값이면 모두 기본값으로 바꿉니다. 0이나 빈 문자열을 지키려면 null·undefined일 때만 바꾸는 ?? 연산자를 씁니다.

확인 문제

1. 예제의 2번 줄을 const memo = '0';으로 바꿨습니다. 무엇이 찍히는지 줄마다 그대로 쓰세요.

const orders = [];
const memo = '0';
const stock = 0;
if (orders.length === 0) {
  console.log('주문 없음');
}
console.log(memo || '메모 없음');
console.log(stock ?? '모름');
힌트

7번 줄에서 '0'이 거짓 같은 값 여덟에 드는지 보세요.

정답
실행 결과
주문 없음
0
0

'0'은 글자가 하나 있는 문자열이라 참 같은 값입니다. 그래서 7번 줄의 || 연산자가 왼쪽 '0'을 돌려주고, console.log가 따옴표 없이 0을 찍습니다. 8번 줄은 예제와 같습니다.

흔한 오답은 둘째 줄의 메모 없음입니다. 따옴표 안의 0도 수 0처럼 거짓 같은 값이라고 본 것입니다.

2. 주문이 비었으면 주문 없음을 찍고, 재고는 0이어도 그대로 찍되 null·undefined일 때만 모름을 찍으려 합니다. 빈칸 둘을 채우세요.

const orders = [];
const stock = 0;
if (orders.length ___ 0) {
  console.log('주문 없음');
}
console.log(stock ___ '모름');
힌트

첫 빈칸은 길이가 0과 같은지 묻는 연산자, 둘째 빈칸은 null·undefined일 때만 기본값을 고르는 연산자입니다.

정답

차례로 === 연산자와 ?? 연산자이고, 주문 없음과 0이 찍힙니다.

다르게 써도 되는 곳: 길이는 0보다 작아지지 않으니 첫 빈칸에 <= 연산자를 써도 같습니다.

흔한 오답은 둘째 빈칸의 || 연산자입니다. 0이 거짓 같은 값이라 재고 0개가 모름으로 바뀝니다.

3. 성적 앱이 아직 넣지 않은 점수를 null로 적습니다. 무엇이 찍히는지 줄마다 쓰세요.

const math = 0;
const art = null;
console.log(math || '미입력');
console.log(math ?? '미입력');
console.log(art ?? '미입력');
힌트

줄마다 왼쪽 값이 거짓 같은 값인지, null·undefined인지를 따로 보세요.

정답
실행 결과
미입력
0
미입력

3번 줄은 0이 거짓 같은 값이라 '미입력'을 돌려줍니다. 4번 줄은 0이 null·undefined가 아니라 0이 남습니다. 5번 줄은 null이라 '미입력'입니다.

흔한 오답은 첫 줄의 0입니다. ||·?? 연산자가 같은 일을 한다고 본 것입니다. 0점도 점수이니 이 앱에는 ?? 연산자가 맞습니다.

컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요. 4절 코드(네 줄)를 main.js에 저장해 돌립니다. 그다음 2·4번 줄의 ?? 연산자를 || 연산자로 바꾸면 무엇이 찍힐지 먼저 적고, 바꿔 돌려서 맞춰 봅니다. 저장하고 돌리는 법은 내 컴퓨터에서 돌려 보기에 있습니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

자바스크립트 목차로