๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

[Easy] ๐Ÿ“„ JavaScript Operators

1. What is the difference between == and === ?โ€‹

==์™€ ===์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋‘˜ ๋‹ค ๋น„๊ต ์—ฐ์‚ฐ์ž์ด์ง€๋งŒ, ==๋Š” ๋‘ ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๊ณ , ===๋Š” ๋‘ ๊ฐ’์ด ๊ฐ™๊ณ  ํƒ€์ž…๋„ ๋™์ผํ•œ์ง€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ›„์ž๋Š” ์—„๊ฒฉ ๋ชจ๋“œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ž๋Š” JavaScript์˜ ์„ค๊ณ„์ƒ ์ž๋™์œผ๋กœ ํƒ€์ž… ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ง๊ด€์— ๋ฐ˜ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

1 == '1'; // true
1 == [1]; // true
1 == true; // true
0 == ''; // true
0 == '0'; // true
0 == false; // true

์ด๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํฐ ์ธ์ง€์  ๋ถ€๋‹ด์ด ๋˜๋ฏ€๋กœ, == ๋Œ€์‹  ===๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋ฒ” ์‚ฌ๋ก€: ==๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๋งค์šฐ ๋ช…ํ™•ํžˆ ์•Œ์ง€ ์•Š๋Š” ํ•œ, ํ•ญ์ƒ ===์™€ !==๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฉด์ ‘ ๋ฌธ์ œโ€‹

๋ฌธ์ œ 1: ๊ธฐ๋ณธ ํƒ€์ž… ๋น„๊ตโ€‹

๋‹ค์Œ ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์„ธ์š”:

1 == '1'; // ?
1 === '1'; // ?

๋‹ต:

1 == '1'; // true
1 === '1'; // false

ํ•ด์„ค:

  • == (๋™๋“ฑ ์—ฐ์‚ฐ์ž): ํƒ€์ž… ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰
    • ๋ฌธ์ž์—ด '1'์ด ์ˆซ์ž 1๋กœ ๋ณ€ํ™˜๋จ
    • ๊ทธ ํ›„ 1 == 1์„ ๋น„๊ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋Š” true
  • === (์—„๊ฒฉ ๋™๋“ฑ ์—ฐ์‚ฐ์ž): ํƒ€์ž… ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
    • number์™€ string์€ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฏ€๋กœ ๋ฐ”๋กœ false๋ฅผ ๋ฐ˜ํ™˜

ํƒ€์ž… ๋ณ€ํ™˜ ๊ทœ์น™:

// == ์˜ ํƒ€์ž… ๋ณ€ํ™˜ ์šฐ์„ ์ˆœ์œ„
// 1. number๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ์ชฝ์„ number๋กœ ๋ณ€ํ™˜
'1' == 1; // '1' โ†’ 1, ๊ฒฐ๊ณผ true
'2' == 2; // '2' โ†’ 2, ๊ฒฐ๊ณผ true
'0' == 0; // '0' โ†’ 0, ๊ฒฐ๊ณผ true

// 2. boolean์ด ์žˆ์œผ๋ฉด boolean์„ number๋กœ ๋ณ€ํ™˜
true == 1; // true โ†’ 1, ๊ฒฐ๊ณผ true
false == 0; // false โ†’ 0, ๊ฒฐ๊ณผ true
'1' == true; // '1' โ†’ 1, true โ†’ 1, ๊ฒฐ๊ณผ true

// 3. ๋ฌธ์ž์—ด์—์„œ ์ˆซ์ž๋กœ์˜ ๋ณ€ํ™˜ ํ•จ์ •
'' == 0; // '' โ†’ 0, ๊ฒฐ๊ณผ true
' ' == 0; // ' ' โ†’ 0, ๊ฒฐ๊ณผ true (๊ณต๋ฐฑ ๋ฌธ์ž์—ด์€ 0์œผ๋กœ ๋ณ€ํ™˜๋จ)

๋ฌธ์ œ 2: null๊ณผ undefined ๋น„๊ตโ€‹

๋‹ค์Œ ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์„ธ์š”:

undefined == null; // ?
undefined === null; // ?

๋‹ต:

undefined == null; // true
undefined === null; // false

ํ•ด์„ค:

์ด๊ฒƒ์€ JavaScript์˜ ํŠน์ˆ˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค:

  • undefined == null: true
    • ES ๋ช…์„ธ์—์„œ ํŠน๋ณ„ํžˆ ๊ทœ์ •: null๊ณผ undefined๋Š” ==๋กœ ๋น„๊ตํ•  ๋•Œ ๊ฐ™์Œ
    • ์ด๊ฒƒ์ด ==๊ฐ€ ์œ ์šฉํ•œ ์œ ์ผํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค: ๋ณ€์ˆ˜๊ฐ€ null ๋˜๋Š” undefined์ธ์ง€ ํ™•์ธ
  • undefined === null: false
    • ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž… (undefined๋Š” undefined ํƒ€์ž…, null์€ object ํƒ€์ž…)
    • ์—„๊ฒฉ ๋น„๊ต ์‹œ ๊ฐ™์ง€ ์•Š์Œ

์‹ค๋ฌด ์‘์šฉ:

// ๋ณ€์ˆ˜๊ฐ€ null ๋˜๋Š” undefined์ธ์ง€ ํ™•์ธ
function isNullOrUndefined(value) {
return value == null; // null๊ณผ undefined๋ฅผ ๋™์‹œ์— ํ™•์ธ
}

isNullOrUndefined(null); // true
isNullOrUndefined(undefined); // true
isNullOrUndefined(0); // false
isNullOrUndefined(''); // false

// ๋™๋“ฑํ•˜์ง€๋งŒ ๋” ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•
function isNullOrUndefined(value) {
return value === null || value === undefined;
}

์ฃผ์˜ํ•  ํ•จ์ •:

// null๊ณผ undefined๋Š” ์„œ๋กœ์—๊ฒŒ๋งŒ ๊ฐ™์Œ
null == undefined; // true
null == 0; // false
null == false; // false
null == ''; // false

undefined == 0; // false
undefined == false; // false
undefined == ''; // false

// ํ•˜์ง€๋งŒ ===์—์„œ๋Š” ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ๋งŒ ๊ฐ™์Œ
null === null; // true
undefined === undefined; // true
null === undefined; // false

๋ฌธ์ œ 3: ์ข…ํ•ฉ ๋น„๊ตโ€‹

๋‹ค์Œ ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์„ธ์š”:

0 == false; // ?
0 === false; // ?
'' == false; // ?
'' === false; // ?
null == false; // ?
undefined == false; // ?

๋‹ต:

0 == false; // true (false โ†’ 0)
0 === false; // false (ํƒ€์ž…์ด ๋‹ค๋ฆ„: number vs boolean)
'' == false; // true ('' โ†’ 0, false โ†’ 0)
'' === false; // false (ํƒ€์ž…์ด ๋‹ค๋ฆ„: string vs boolean)
null == false; // false (null์€ null๊ณผ undefined์—๋งŒ ๊ฐ™์Œ)
undefined == false; // false (undefined๋Š” null๊ณผ undefined์—๋งŒ ๊ฐ™์Œ)

๋ณ€ํ™˜ ํ๋ฆ„๋„:

// 0 == false ์˜ ๋ณ€ํ™˜ ๊ณผ์ •
0 == false;
0 == 0; // false๋ฅผ ์ˆซ์ž 0์œผ๋กœ ๋ณ€ํ™˜
true; // ๊ฒฐ๊ณผ

// '' == false ์˜ ๋ณ€ํ™˜ ๊ณผ์ •
'' == false;
'' == 0; // false๋ฅผ ์ˆซ์ž 0์œผ๋กœ ๋ณ€ํ™˜
0 == 0; // ''๋ฅผ ์ˆซ์ž 0์œผ๋กœ ๋ณ€ํ™˜
true; // ๊ฒฐ๊ณผ

// null == false ์˜ ํŠน์ˆ˜ ๊ฒฝ์šฐ
null == false;
// null์€ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Œ! ๋ช…์„ธ์— ๋”ฐ๋ผ, null์€ null๊ณผ undefined์—๋งŒ ๊ฐ™์Œ
false; // ๊ฒฐ๊ณผ

๋ฌธ์ œ 4: ๊ฐ์ฒด ๋น„๊ตโ€‹

๋‹ค์Œ ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์„ธ์š”:

[] == []; // ?
[] === []; // ?
{} == {}; // ?
{} === {}; // ?

๋‹ต:

[] == []; // false
[] === []; // false
{} == {}; // false
{} === {}; // false

ํ•ด์„ค:

  • ๊ฐ์ฒด(๋ฐฐ์—ด, ๊ฐ์ฒด ํฌํ•จ)์˜ ๋น„๊ต๋Š” ์ฐธ์กฐ ๋น„๊ต
  • ๋‚ด์šฉ์ด ๊ฐ™๋”๋ผ๋„, ๋‹ค๋ฅธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์ด๋ฉด ๊ฐ™์ง€ ์•Š์Œ
  • ==์™€ ===๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ (๋ชจ๋‘ ์ฐธ์กฐ๋ฅผ ๋น„๊ต)
// ์ฐธ์กฐ๊ฐ€ ๊ฐ™์„ ๋•Œ๋งŒ ๊ฐ™์Œ
const arr1 = [];
const arr2 = arr1; // ๊ฐ™์€ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ
arr1 == arr2; // true
arr1 === arr2; // true

// ๋‚ด์šฉ์ด ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค
const arr3 = [1, 2, 3];
const arr4 = [1, 2, 3];
arr3 == arr4; // false (๋‹ค๋ฅธ ์ฐธ์กฐ)
arr3 === arr4; // false (๋‹ค๋ฅธ ์ฐธ์กฐ)

// ๊ฐ์ฒด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€
const obj1 = { name: 'Alice' };
const obj2 = { name: 'Alice' };
obj1 == obj2; // false
obj1 === obj2; // false

๋ฉด์ ‘ ๋น ๋ฅธ ์•”๊ธฐโ€‹

==์˜ ํƒ€์ž… ๋ณ€ํ™˜ ๊ทœ์น™ (์œ„์—์„œ๋ถ€ํ„ฐ ์šฐ์„ ):

  1. null == undefined โ†’ true (ํŠน์ˆ˜ ๊ทœ์น™)
  2. number == string โ†’ string์„ number๋กœ ๋ณ€ํ™˜
  3. number == boolean โ†’ boolean์„ number๋กœ ๋ณ€ํ™˜
  4. string == boolean โ†’ ๋ชจ๋‘ number๋กœ ๋ณ€ํ™˜
  5. ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ๋น„๊ต, ๋ณ€ํ™˜ ์—†์Œ

===์˜ ๊ทœ์น™ (๊ฐ„๋‹จ):

  1. ํƒ€์ž…์ด ๋‹ค๋ฆ„ โ†’ false
  2. ํƒ€์ž…์ด ๊ฐ™์Œ โ†’ ๊ฐ’(๊ธฐ๋ณธ ํƒ€์ž…) ๋˜๋Š” ์ฐธ์กฐ(๊ฐ์ฒด ํƒ€์ž…) ๋น„๊ต

๋ชจ๋ฒ” ์‚ฌ๋ก€:

// โœ… ํ•ญ์ƒ === ์‚ฌ์šฉ
if (value === 0) {
}
if (name === 'Alice') {
}

// โœ… ์œ ์ผํ•œ ์˜ˆ์™ธ: null/undefined ํ™•์ธ
if (value == null) {
// value๋Š” null ๋˜๋Š” undefined
}

// โŒ == ์‚ฌ์šฉ ํ”ผํ•˜๊ธฐ (์œ„์˜ ์˜ˆ์™ธ ์ œ์™ธ)
if (value == 0) {
} // ๋น„์ถ”์ฒœ
if (name == 'Alice') {
} // ๋น„์ถ”์ฒœ

๋ฉด์ ‘ ๋‹ต๋ณ€ ์˜ˆ์‹œ:

"==๋Š” ํƒ€์ž… ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ 0 == '0'์ด true๊ฐ€ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง๊ด€์— ๋ฐ˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ===๋Š” ์—„๊ฒฉ ๋น„๊ต๋กœ, ํƒ€์ž… ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ๋ฐ”๋กœ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ํ•ญ์ƒ ===๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์œ ์ผํ•œ ์˜ˆ์™ธ๋Š” value == null๋กœ null๊ณผ undefined๋ฅผ ๋™์‹œ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ์ฃผ์˜ํ•  ์ ์€ null == undefined๊ฐ€ true์ด์ง€๋งŒ null === undefined๋Š” false๋ผ๋Š” ๊ฒƒ์œผ๋กœ, ์ด๋Š” JavaScript์˜ ํŠน์ˆ˜ ๊ทœ์ •์ž…๋‹ˆ๋‹ค."


2. What is the difference between && and || ? Please explain short-circuit evaluationโ€‹

&&์™€ ||์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๋‹จ์ถ• ํ‰๊ฐ€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”

๊ธฐ๋ณธ ๊ฐœ๋…โ€‹

  • && (AND): ์™ผ์ชฝ์ด falsy์ผ ๋•Œ ์™ผ์ชฝ ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ์€ ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ
  • || (OR): ์™ผ์ชฝ์ด truthy์ผ ๋•Œ ์™ผ์ชฝ ๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ์€ ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ

๋‹จ์ถ• ํ‰๊ฐ€ ์˜ˆ์‹œโ€‹

// && ๋‹จ์ถ• ํ‰๊ฐ€
const user = null;
const name = user && user.name; // user๊ฐ€ falsy์ด๋ฏ€๋กœ null์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜, user.name์— ์ ‘๊ทผํ•˜์ง€ ์•Š์Œ
console.log(name); // null (์—๋Ÿฌ ์—†์Œ)

// || ๋‹จ์ถ• ํ‰๊ฐ€
const defaultName = 'Guest';
const userName = user || defaultName; // user๊ฐ€ falsy์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์˜ defaultName์„ ๋ฐ˜ํ™˜
console.log(userName); // 'Guest'

// ์‹ค๋ฌด ์‘์šฉ
function greet(name) {
const displayName = name || 'Anonymous'; // name์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ
console.log(`Hello, ${displayName}!`);
}

greet('Alice'); // Hello, Alice!
greet(); // Hello, Anonymous!

์ž์ฃผ ๋น ์ง€๋Š” ํ•จ์ • โš ๏ธโ€‹

// ๋ฌธ์ œ: 0๊ณผ ''๋„ falsy
const count = 0;
const result = count || 10; // 0์€ falsy์ด๋ฏ€๋กœ 10์„ ๋ฐ˜ํ™˜
console.log(result); // 10 (์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ)

// ํ•ด๊ฒฐ์ฑ…: ?? (Nullish Coalescing) ์‚ฌ์šฉ
const betterResult = count ?? 10; // null/undefined์ธ ๊ฒฝ์šฐ์—๋งŒ 10์„ ๋ฐ˜ํ™˜
console.log(betterResult); // 0

3. What is the ?. (Optional Chaining) operator ?โ€‹

Optional Chaining ์—ฐ์‚ฐ์ž ?.๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋ฌธ์ œ ์‹œ๋‚˜๋ฆฌ์˜คโ€‹

๊ธฐ์กด ์ž‘์„ฑ๋ฒ•์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์›€:

const user = {
name: 'Alice',
address: {
city: 'Taipei',
},
};

// โŒ ์œ„ํ—˜: address๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
console.log(user.address.city); // ์ •์ƒ
console.log(otherUser.address.city); // TypeError: Cannot read property 'city' of undefined

// โœ… ์•ˆ์ „ํ•˜์ง€๋งŒ ์žฅํ™ฉํ•จ
const city = user && user.address && user.address.city;

Optional Chaining ์‚ฌ์šฉโ€‹

// โœ… ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ˆ์ „
const city = user?.address?.city; // 'Taipei'
const missingCity = otherUser?.address?.city; // undefined (์—๋Ÿฌ ์—†์Œ)

// ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
user?.getName?.(); // getName์ด ์กด์žฌํ•˜๋ฉด ์‹คํ–‰

// ๋ฐฐ์—ด์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
const firstItem = users?.[0]?.name; // ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์— ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผ

์‹ค๋ฌด ์‘์šฉโ€‹

// API ์‘๋‹ต ์ฒ˜๋ฆฌ
function displayUserInfo(response) {
const userName = response?.data?.user?.name ?? 'Unknown User';
const email = response?.data?.user?.email ?? 'No email';

console.log(`User: ${userName}`);
console.log(`Email: ${email}`);
}

// DOM ์กฐ์ž‘
const buttonText = document.querySelector('.submit-btn')?.textContent;

4. What is the ?? (Nullish Coalescing) operator ?โ€‹

Nullish Coalescing ์—ฐ์‚ฐ์ž ??๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

||์™€์˜ ์ฐจ์ดโ€‹

// ||๋Š” ๋ชจ๋“  falsy ๊ฐ’์„ ๊ฑฐ์ง“์œผ๋กœ ์ทจ๊ธ‰
const value1 = 0 || 'default'; // 'default'
const value2 = '' || 'default'; // 'default'
const value3 = false || 'default'; // 'default'

// ??๋Š” null๊ณผ undefined๋งŒ ๋นˆ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰
const value4 = 0 ?? 'default'; // 0
const value5 = '' ?? 'default'; // ''
const value6 = false ?? 'default'; // false
const value7 = null ?? 'default'; // 'default'
const value8 = undefined ?? 'default'; // 'default'

์‹ค๋ฌด ์‘์šฉโ€‹

// 0์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž ์ฒ˜๋ฆฌ
function updateScore(newScore) {
// โœ… ์˜ฌ๋ฐ”๋ฆ„: 0์€ ์œ ํšจํ•œ ์ ์ˆ˜
const score = newScore ?? 100; // 0์ด๋ฉด 0์„ ์œ ์ง€, null/undefined์ธ ๊ฒฝ์šฐ์—๋งŒ 100 ์‚ฌ์šฉ
return score;
}

updateScore(0); // 0
updateScore(null); // 100
updateScore(undefined); // 100

// ์„ค์ •๊ฐ’ ์ฒ˜๋ฆฌ
const config = {
timeout: 0, // 0๋ฐ€๋ฆฌ์ดˆ๋Š” ์œ ํšจํ•œ ์„ค์ •
maxRetries: null,
};

const timeout = config.timeout ?? 3000; // 0 (0 ์„ค์ •์„ ์œ ์ง€)
const retries = config.maxRetries ?? 3; // 3 (null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ)

์กฐํ•ฉ ์‚ฌ์šฉโ€‹

// ??์™€ ?.๋Š” ์ž์ฃผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋จ
const userAge = user?.profile?.age ?? 18; // ๋‚˜์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ 18

// ์‹ค๋ฌด ์‚ฌ๋ก€: ํผ ๊ธฐ๋ณธ๊ฐ’
function initForm(data) {
return {
name: data?.name ?? '',
age: data?.age ?? 0, // 0์€ ์œ ํšจํ•œ ๋‚˜์ด
isActive: data?.isActive ?? true,
};
}

5. What is the difference between i++ and ++i ?โ€‹

i++์™€ ++i์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ธฐ๋ณธ ์ฐจ์ดโ€‹

  • i++ (ํ›„์œ„): ํ˜„์žฌ ๊ฐ’์„ ๋จผ์ € ๋ฐ˜ํ™˜ํ•œ ํ›„ 1์„ ๋”ํ•จ
  • ++i (์ „์œ„): ๋จผ์ € 1์„ ๋”ํ•œ ํ›„ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ˜ํ™˜

์˜ˆ์‹œโ€‹

let a = 5;
let b = a++; // b = 5, a = 6 (๋จผ์ € b์— ํ• ๋‹นํ•œ ํ›„ ์ฆ๊ฐ€)
console.log(a, b); // 6, 5

let c = 5;
let d = ++c; // d = 6, c = 6 (๋จผ์ € ์ฆ๊ฐ€ํ•œ ํ›„ d์— ํ• ๋‹น)
console.log(c, d); // 6, 6

์‹ค๋ฌด ์˜ํ–ฅโ€‹

// ๋ฃจํ”„์—์„œ๋Š” ๋ณดํ†ต ์ฐจ์ด ์—†์Œ (๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ)
for (let i = 0; i < 5; i++) {} // โœ… ์ผ๋ฐ˜์ 
for (let i = 0; i < 5; ++i) {} // โœ… ์ด๊ฒƒ๋„ ๊ฐ€๋Šฅ, ์ผ๋ถ€๋Š” ์•ฝ๊ฐ„ ๋” ๋น ๋ฅด๋‹ค๊ณ  ์ƒ๊ฐ (์‹ค์ œ๋กœ ํ˜„๋Œ€ JS ์—”์ง„์—์„œ๋Š” ์ฐจ์ด ์—†์Œ)

// ํ•˜์ง€๋งŒ ํ‘œํ˜„์‹์—์„œ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ
let arr = [1, 2, 3];
let i = 0;
console.log(arr[i++]); // 1 (๋จผ์ € i=0์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ ํ›„ i๊ฐ€ 1์ด ๋จ)
console.log(arr[++i]); // 3 (i๊ฐ€ ๋จผ์ € 2๊ฐ€ ๋œ ํ›„ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด)

๋ชจ๋ฒ” ์‚ฌ๋ก€โ€‹

// โœ… ๋ช…ํ™•ํ•จ: ๋ถ„๋ฆฌํ•ด์„œ ์ž‘์„ฑ
let count = 0;
const value = arr[count];
count++;

// โš ๏ธ ๋น„์ถ”์ฒœ: ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฌ์›€
const value = arr[count++];

6. What is the Ternary Operator ? When should you use it ?โ€‹

์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

๊ธฐ๋ณธ ๊ตฌ๋ฌธโ€‹

condition ? valueIfTrue : valueIfFalse;

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œโ€‹

// ๊ธฐ์กด if-else
let message;
if (age >= 18) {
message = 'Adult';
} else {
message = 'Minor';
}

// โœ… ์‚ผํ•ญ ์—ฐ์‚ฐ์ž: ๋” ๊ฐ„๊ฒฐ
const message = age >= 18 ? 'Adult' : 'Minor';

์ ํ•ฉํ•œ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜คโ€‹

// 1. ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด๋ถ€ ํ• ๋‹น
const status = isLoggedIn ? 'Online' : 'Offline';

// 2. JSX/ํ…œํ”Œ๋ฆฟ์—์„œ์˜ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง
return <div>{isLoading ? <Spinner /> : <Content />}</div>;

// 3. ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • (๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž์™€ ์กฐํ•ฉ)
const displayName = user?.name ?? 'Guest';
const greeting = isVIP ? `Welcome, ${displayName}!` : `Hello, ${displayName}`;

// 4. ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’
function getDiscount(isMember) {
return isMember ? 0.2 : 0;
}

์‚ฌ์šฉ์„ ํ”ผํ•ด์•ผ ํ•  ์‹œ๋‚˜๋ฆฌ์˜คโ€‹

// โŒ ์ค‘์ฒฉ์ด ๋„ˆ๋ฌด ๊นŠ์–ด ์ฝ๊ธฐ ์–ด๋ ค์›€
const result = condition1
? value1
: condition2
? value2
: condition3
? value3
: value4;

// โœ… if-else ๋˜๋Š” switch๊ฐ€ ๋” ๋ช…ํ™•
let result;
if (condition1) result = value1;
else if (condition2) result = value2;
else if (condition3) result = value3;
else result = value4;

// โŒ ๋ณต์žกํ•œ ๋กœ์ง
const canAccess =
user?.role === 'admin'
? true
: user?.permissions?.includes('read')
? true
: false;

// โœ… ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ถ„๋ฆฌ
const isAdmin = user?.role === 'admin';
const hasReadPermission = user?.permissions?.includes('read');
const canAccess = isAdmin || hasReadPermission;

๋น ๋ฅธ ์•”๊ธฐ ์นด๋“œโ€‹

์—ฐ์‚ฐ์ž์šฉ๋„๊ธฐ์–ต ํฌ์ธํŠธ
===์—„๊ฒฉ ๋™๋“ฑํ•ญ์ƒ ์ด๊ฒƒ์„ ์‚ฌ์šฉ, ==๋Š” ์žŠ๊ธฐ
&&๋‹จ์ถ• AND์™ผ์ชฝ์ด ๊ฑฐ์ง“์ด๋ฉด ๋ฉˆ์ถ”๊ณ  ๊ฑฐ์ง“๊ฐ’ ๋ฐ˜ํ™˜
||๋‹จ์ถ• OR์™ผ์ชฝ์ด ์ฐธ์ด๋ฉด ๋ฉˆ์ถ”๊ณ  ์ฐธ๊ฐ’ ๋ฐ˜ํ™˜
?.Optional Chaining์•ˆ์ „ํ•œ ์ ‘๊ทผ, ์—๋Ÿฌ ์—†์Œ
??Nullish Coalescingnull/undefined๋งŒ ์ฒ˜๋ฆฌ
++i / i++์ž๊ธฐ ์ฆ๊ฐ€์ „์œ„๋Š” ๋จผ์ € ์ฆ๊ฐ€, ํ›„์œ„๋Š” ๋‚˜์ค‘์— ์ฆ๊ฐ€
? :์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ„๋‹จํ•œ ์กฐ๊ฑด์— ์‚ฌ์šฉ, ์ค‘์ฒฉ์€ ํ”ผํ•˜๊ธฐ

Referenceโ€‹