Skip to content

Latest commit

ย 

History

History
470 lines (343 loc) ยท 21.4 KB

File metadata and controls

470 lines (343 loc) ยท 21.4 KB

๋ถˆ๋ณ€๊ฐ์ฒด์™€ undefined, null

๐Ÿค˜ ๋ชฉํ‘œ

  • ๋ถˆ๋ณ€๊ฐ์ฒด์— ๋Œ€ํ•ด ์ดํ•ดํ•œ๋‹ค.
  • ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค.
  • undefined์™€ null์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค.

๐Ÿ”ฅ ๋ถˆ๋ณ€๊ฐ์ฒด

  1. ๋ถˆ๋ณ€๊ฐ์ฒด๋ž€?

    ๋ถˆ๋ณ€๊ฐ์ฒด๋Š” ์ตœ๊ทผ React, Vue, Angular ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋””์ž์ธ ํŒจํ„ด ๋“ฑ์—์„œ๋„ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ๊ฐ€๋ณ€์€ ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งŒ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋ฉด(์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ณ ์ž ํ•˜๋ฉด) ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์žฌํ• ๋‹นํ•˜๊ธฐ๋กœ ๊ทœ์น™์„ ์ •ํ•˜๊ฑฐ๋‚˜, ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋„๊ตฌ(immutable.js, immer,js, immutability-helper ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ES6์˜ spread operator, Object.assign ๋“ฑ)๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๋ถˆ๋ณ€์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์€ ๋ถˆ๋ณ€์„ฑ์„ ํ™•๋ณดํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด ๋ฐฉ์‹๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹์œผ๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ณ€๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋จผ์ €, ์•ž์„œ ์–ธ๊ธ‰ํ•œ spread operator์™€ Object.assign ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    const arr1 = [1, 2, 3];

    ๋จผ์ € arr1์„ ์œ„์™€ ๊ฐ™์ด ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

    const arr1 = [1, 2, 3];
    const arr2 = arr1;
    
    arr2[0] = 4;
    
    console.log(arr1); // [4, 2, 3];
    console.log(arr2); // [4, 2, 3];

    ์ด์ „ ํŒŒํŠธ์—์„œ ํ•™์Šตํ–ˆ๋“ฏ์ด arr2์— arr1์„ ์œ„์™€ ๊ฐ™์ด ํ• ๋‹นํ•˜๋ฉด ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ์ฐธ์กฐ๊ฐ€ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „๊ฐœ ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ• ๋‹นํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

    const arr1 = [1, 2, 3];
    const arr2 = [...arr1];
    
    arr2[0] = 4;
    
    console.log(arr1); // [1, 2, 3];
    console.log(arr2); // [4, 2, 3];

    ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๋“ฏ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋”๋ผ๋„ ์›๋ณธ ๊ฐ์ฒด๋Š” ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ถˆ๋ณ€๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Object.assign๋„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    const target = {};
    const source = { a: 1, b: 2 };
    
    Object.assign(target, source); // taget์— source๋ฅผ ํ• ๋‹น!
    
    console.log(target); // { a: 1, b: 2 }
    console.log(source); // { a: 1, b: 2 }
    
    target['c'] = 3;
    
    console.log(target); // { a: 1, b: 2, c: 3 }
    console.log(source); // { a: 1, b: 2 }

    ์—ญ์‹œ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Object.assign์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    const target = { a: 1, b: 2 };
    const source = { b: 3, c: 4 };
    
    Object.assign(target, source); // taget์— source๋ฅผ ํ• ๋‹น!
    
    console.log(target); // { a: 1, b: 3, c: 4 }
    console.log(source); // { b: 3, c: 4 }
  2. ๋ถˆ๋ณ€๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

    ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณธ ๋‹ค์Œ ์„ค๋ช…๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    const user = {
        name: 'soulcactus',
        gender: 'female',
    };
    
    const changeName = (user, newName) => {
        const newUser = user;
    
        newUser['name'] = newName;
    
        return newUser;
    };
    
    const user2 = changeName(user, 'hwizzzang'); // ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜
    
    if (user !== user2) {
        console.log('์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    }
    
    console.log(user['name'], user2['name']); // hwizzzang hwizzzang
    console.log(user === user2); // true

    newUser์— user๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ˆœ๊ฐ„ ์šฐ๋ฆฌ๋Š” ์ฐธ์กฐ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์ œ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์œผ์‹ ๋‹ค๋ฉด part01์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”. ์กฐ๊ฑด๋ฌธ์„ ์‚ดํŽด๋ณด์‹œ๋ฉด "์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์•Œ๋ ค์ฃผ์ž!"๋Š” ์ด ๋กœ์ง์˜ ๋ชฉํ‘œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์•ˆํƒ€๊น์ง€๋งŒ ํ˜„์žฌ ์ฝ”๋“œ๋กœ๋Š” ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค(...) ์œ„์™€ ๊ฐ™์ด ์ •๋ณด๊ฐ€ ๋ฐ”๋€ ์‹œ์ ์— ์•Œ๋ฆผ์„ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๊ฑฐ๋‚˜, ๋ฐ”๋€Œ๊ธฐ ์ „์˜ ์ •๋ณด์™€ ๋ฐ”๋€Œ๊ธฐ ์ „์˜ ์ •๋ณด ์ฐจ์ด๋ฅผ ๊ฐ€์‹œ์ ์œผ๋กœ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด๋Œ€๋กœ๋Š” ์•ˆ๋˜๋ฏ€๋กœ ๋ณ€๊ฒฝ ์ „๊ณผ ํ›„์— ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    const user = {
        name: 'soulcactus',
        gender: 'female',
    };
    
    const changeName = (user, newName) => {
        return {
            name: newName,
            gender: user['gender'],
        };
    };
    
    const user2 = changeName(user, 'hwizzzang');
    
    if (user !== user2) {
        console.log('์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); // ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘
    }
    
    console.log(user['name'], user2['name']); // soulcactus hwizzzang
    console.log(user === user2); // false

    changeName ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ user์™€ user2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝ ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์•„์ง ๋ฏธํกํ•œ ์ ์ด ๋ณด์ด๋Š”๋ฐ์š”, changeName ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ธฐ์กฑ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ(์ด ๊ฒฝ์šฐ์—๋Š” gender)๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์ž…๋ ฅํ•œ ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ๋Š” ๋Œ€์ƒ ๊ฐ์ฒด์— ์ •๋ณด๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก, ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ •๋ณด๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ˆ˜๊ณ ๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ๋Œ€์ƒ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ˆ˜์— ์ƒ๊ด€ ์—†์ด ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ํŽธ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    const copyObject = (target) => {
        const result = {};
    
        for (const prop in target) {
            result[prop] = target[prop];
        }
    
        return result;
    };

    copyObject ํ•จ์ˆ˜๋Š” for in ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด result ๊ฐ์ฒด์— target ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹ ์ƒ์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ , getter, setter๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š” ์ , ์–•์€ ๋ณต์‚ฌ(๋’ท ๋ถ€๋ถ„์—์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์—์„œ ์•ฝ๊ฐ„์˜ ์•„์‰ฌ์›€์ด ์žˆ์œผ๋‚˜ ๊ทธ ์•„์‰ฌ์›€์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ๋ฌด๊ฒ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ๋‹จ ์ด ์˜ˆ์ œ์˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌธ์ œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง„ํ–‰ํ•ด๋ณด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    const user = {
        name: 'soulcactus',
        gender: 'female',
    };
    
    const user2 = copyObject(user);
    
    user2['name'] = 'hwizzzang';
    
    if (user !== user2) {
        console.log('์œ ์ € ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); // ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘
    }
    
    console.log(user['name'], user2['name']); // soulcactus hwizzzang
    console.log(user === user2); // false

    copyObject ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ํ˜‘์—…ํ•˜๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋“ค์ด user ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด copyObject ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•ฉ์˜ํ•˜๊ณ  ๊ทธ ๊ทœ์น™์„ ์ง€ํ‚จ๋‹ค๋Š” ์ „์ œํ•˜์—์„œ๋Š” user ๊ฐ์ฒด๊ฐ€ ๊ณง ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋ชจ๋‘๊ฐ€ ๊ทธ ๊ทœ์น™์„ ์ง€ํ‚ค๋ฆฌ๋ผ๋Š” ์‹ ๋ขฐ์—๋งŒ ์˜์ง€ํ•˜๋Š” ๊ฒƒ์€ ์–‡๊ณ  ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์‚ด์–ผ์ŒํŒ์„ ๊ฑท๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ณด๋‹ค๋Š” ๋ชจ๋‘๊ฐ€ ๊ทธ ๊ทœ์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ๋” ์‹œ์Šคํ…œ์ ์œผ๋กœ ์ œ์•ฝ์„ ๊ฑฐ๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์— ๋ถˆ๋ณ€์„ฑ์„ ์ง€๋‹Œ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” immutable.js, baobab.js ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•ด ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“„ ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ๋ž€ ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ๊นŠ์€ ๋ณต์‚ฌ๋ž€ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ์ „๋ถ€ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์•ž์„œ copyObject ํ•จ์ˆ˜๋Š” ์–•์€ ๋ณต์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ง์€ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๊ทธ ์ฃผ์†Ÿ๊ฐ’๋งŒ ๋ณต์‚ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์›๋ณธ๊ณผ ์‚ฌ๋ณธ์ด ๋ชจ๋‘ ๋™์ผํ•œ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋ณธ์„ ๋ฐ”๊พธ๋ฉด ์›๋ณธ๋„ ๋ฐ”๋€Œ๊ณ , ์›๋ณธ์„ ๋ฐ”๊พธ๋ฉด ์‚ฌ๋ณธ๋„ ๋ฐ”๋€๋‹ˆ๋‹ค.

const user = {
    name: 'soulcactus',
    urls: {
        portfolio: 'https://github.com/soulcactus',
        blog: 'https://soulcactus.netlify.com',
        twitter: 'https://twitter.com/_soulcactus',
    },
};

const user2 = copyObject(user);

user2['name'] = 'hwizzzang';

console.log(user['name'] === user2['name']); // false

user['urls']['portfolio'] = 'https://github.com/hwizzzang';

console.log(user['urls']['portfolio'] === user2['urls']['portfolio']); // true

user2['urls']['blog'] = '';

console.log(user['urls']['blog'] === user2['urls']['blog']); // true

์–•์€ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— user2์˜ urls๊ฐ€ user์˜ urls๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด user.urls ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด์„œ๋„ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const user2 = copyObject(user);

user2['urls'] = copyObject(user['urls']);
user['urls']['portfolio'] = 'https://github.com/hwizzzang';

console.log(user['urls']['portfolio'] === user2['urls']['portfolio']); // false

user2['urls']['blog'] = '';

console.log(user['urls']['blog'] === user2['urls']['blog']); // false

user์˜ urls ํ”„๋กœํผํ‹ฐ๋„ copyObject๋ฅผ ํ†ตํ•ด ๋ณต์‚ฌํ•ด user2์˜ urls์— ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ user2์˜ urls๋Š” user์˜ urls๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ค‘์—์„œ ๊ทธ ๊ฐ’์ด ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์ผ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜๋ฉด ๋˜์ง€๋งŒ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์ผ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์‹œ ๊ทธ ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ๋งŒ ๋น„๋กœ์†Œ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ copyObject ํ•จ์ˆ˜๋ฅผ ๊นŠ์€ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const copyObjectDeep = (target) => {
    let result = {};

    if (typeof target === 'object' && target !== null) {
        for (const prop in target) {
            result[prop] = copyObjectDeep(target[prop]);
        }
    } else {
        result = target;
    }

    return result;
};

target !== null ์กฐ๊ฑด์„ ๋ถ™์ธ ์ด์œ ๋Š” typeof ๋ช…๋ น์–ด๊ฐ€ null์— ๋Œ€ํ•ด์„œ๋„ object๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž์ฒด ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

const obj = {
    a: 1,
    b: {
        c: null,
        d: [1, 2],
    },
};

const obj2 = copyObjectDeep(obj);

obj2['a'] = 3;
obj2['b']['c'] = 4;
obj2['b']['d'][1] = 3;

console.log(obj); // { a: 1, b: { c: null, d: [1, 2] } }
console.log(obj2); // { a: 3, b: { c: 4, d: {0: 1, 1: 3}} }

์ถ”๊ฐ€๋กœ hasOwnProperty ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์„ ํ†ตํ•ด ์ƒ์†๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ฒŒ๋” ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

const obj = {
    a: 1,
    b: {
        c: null,
        d: [1, 2],
    },
};

console.log(obj.hasOwnProperty('b')); // true
console.log(obj.hasOwnProperty('c')); // false

ES5์˜ getter์™€ setter๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ˆํƒ€๊น๊ฒŒ๋„ ES6์˜ Object.getOwnPropertyDescriptor ๋˜๋Š” ES2017์˜ Object.getOwnPropertyDescriptor ์™ธ์—๋Š” ๋งˆ๋•…ํ•œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ํ•˜๋‚˜๋ฅผ ๋” ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์›๋ฆฌ๋„ ๋‹จ์ˆœํ•œ๋ฐ์š”, ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ๋ฒ•์œผ๋กœ ํ‘œํ˜„๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ JSON ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋ฉ”์„œ๋“œ(ํ•จ์ˆ˜)๋‚˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ์ธ proto๋‚˜ getter, setter ๋“ฑ๊ณผ ๊ฐ™์ด JSON์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœํผํ‹ฐ๋“ค์€ ๋ชจ๋‘ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. httpRequest๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๋“ฑ ์ˆœ์ˆ˜ํ•œ ์ •๋ณด๋งŒ ๋‹ค๋ฃฐ ๋•Œ ํ™œ์šฉํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

const copyObjectViaJSON = (target) => {
    return JSON.parse(JSON.stringify(target));
};

const obj = {
    a: 1,
    b: {
        c: null,
        d: [1, 2],
        func1: function() {
            console.log(3);
        },
        func2: function() {
            console.log(4);
        },
    },
};

const obj2 = copyObjectViaJSON(obj);

obj2['a'] = 3;
obj2['b']['c'] = 4;
obj['b']['d'][1] = 3;

console.log(obj); // { a: 1, b: { c: null, d: [1, 3], func1: f(), func2: f() }}
console.log(obj2); // { a: 3, b: { c: 4, d: [1, 2] } }

โŽ undefined์™€ null

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ๋ฐ”๋กœ undefined์™€ null์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ’์€ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ๊ฐ™์€ ๋“ฏํ•˜๋‚˜ ๋ฏธ์„ธํ•˜๊ฒŒ ๋‹ค๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๋˜ํ•œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  1. undefined

    undefined๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‘๋‹น ์–ด๋–ค ๊ฐ’์„ ์ง€์ •ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ๋˜๋Š” ์ƒํ™ฉ์ž„์—๋„ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐ’์„ ๋Œ€์ž…ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜, ์ฆ‰ ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ์‹๋ณ„์ž์— ์ ‘๊ทผํ•  ๋•Œ
    • ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ
    • return๋ฌธ์ด ์—†๊ฑฐ๋‚˜ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ
    let a;
    
    console.log(a); // undefined
    
    const obj = { a: 1 };
    
    console.log(obj['a']); // 1
    console.log(obj['b']); // undefined
    console.log(b); // Uncaught ReferenceError: b is not defined
    
    const func = () => {}; // return ๊ฐ’์ด ์—†์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ
    const c = func();
    
    console.log(c); // undefined

    undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋ ˆํผ๋Ÿฐ์Šค ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด, not defined๋Š” ์ •์˜๋œ ์ ์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๊ณ  undefined๋Š” ์•„์ง ์ •์˜๋˜์ง€ ์•Š์•˜์Œ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ a๋Š” ์ด๋ฏธ ์„ ์–ธ๋์œผ๋‚˜ ์•„์ง ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. obj['b'] ์—ญ์‹œ ์•„์ง ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ b๋Š” ์ •์˜๋œ ์ ์ด ์—†์œผ๋ฏ€๋กœ ๋ ˆํผ๋Ÿฐ์Šค ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ณ€์ˆ˜ a๋ฅผ ์„ ์–ธํ•˜๊ณ  ์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, ๋‹ค๋ฅธ ๋„์„œ์—์„œ๋Š” "let a๋ผ๋Š” ๊ตฌ๋ฌธ์— ์˜ํ•ด ์‹๋ณ„์ž a์— ์ž๋™์œผ๋กœ undefined๊ฐ€ ํ• ๋‹น๋˜๊ณ , ๊ทธ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ์‹๋ณ„์ž์— ์ ‘๊ทผํ•  ๋•Œ" ์ž๋™์œผ๋กœ ํ• ๋‹น๋œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ๋๋‚˜๋ฉฐ, ์ดํ›„ ๋ณ€์ˆ˜ a์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ ๋น„๋กœ์†Œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.

    ๊ฐ’์„ ๋Œ€์ž…ํ•˜์ง€ ์•Š์€ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ์กฐ๊ธˆ ํŠน์ดํ•œ ๋™์ž‘์„ ํ•˜๋Š”๋ฐ์š”, ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    const arr1 = [];
    
    console.log(arr1); // []
    
    arr1.length = 3;
    console.log(arr1); // [empty x 3];
    
    const arr2 = new Array(3);
    
    console.log(arr2); // [empty x 3];
    
    const arr3 = [undefined, undefined, undefined];
    
    console.log(arr3); // [undefined, undefined, undefined]

    ๋นˆ ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ ํ›„ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด undefined ์กฐ์ฐจ ๋“ค์–ด ์žˆ์ง€ ์•Š์€ ์„ธ ๊ฐœ์˜ ๋นˆ ์š”์†Œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์„ธ ๊ฐœ์˜ undefined๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์„ธ ๊ฐœ์˜ undefined๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋น„์–ด ์žˆ๋Š” ์š”์†Œ์™€ undefined๋ฅผ ํ• ๋‹นํ•œ ์š”์†Œ๋Š” ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋ฉฐ, ๋นˆ ์š”์†Œ๋Š” ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์˜ ์ˆœํšŒ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    const arr1 = [undefined, 1];
    const arr2 = [];
    
    arr2[1] = 1;
    
    arr1.forEach((v, i) => console.log(v, i)); // undefined 0 / 1 1
    arr2.forEach((v, i) => console.log(v, i)); // 1 1
    
    arr1.map((v, i) => v + i); // [NaN, 2]
    arr2.map((v, i) => v + i); // [empty, 2]
    
    arr1.filter((v) => !v); // [undefined]
    arr2.filter((v) => !v); // []
    
    arr1.reduce((p, c, i) => {
        return p + c + i;
    }, ''); // undefined011
    
    arr2.reduce((p, c, i) => {
        return p + c + i;
    }, ''); // 11

    ์ง์ ‘ undefined๋ฅผ ํ• ๋‹นํ•œ arr1์— ๋Œ€ํ•ด์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ๋Œ€๋กœ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ˆœํšŒํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ arr2์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๊ฐ ๋ฉ”์„œ๋“œ๋“ค์ด ๋น„์–ด ์žˆ๋Š” ์š”์†Œ์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ์ฒ˜๋ฆฌ๋„ ํ•˜์ง€ ์•Š๊ณ  ๊ฑด๋„ˆ๋›ฐ์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์ด ๋ฐฐ์—ด์—์„œ๋งŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ํ˜„์ƒ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์†Œ๊ฐœํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ๋ฐฐ์—ด๋„ ๊ฐ์ฒด์ž„์„ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ง€๊ทนํžˆ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ˆœํšŒํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ ๋ฌด์กฐ๊ฑด length ํ”„๋กœํผํ‹ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋นˆ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ๊ฐ ๊ณต๊ฐ„์— ์ธ๋ฑ์Šค๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠน์ • ์ธ๋ฑ์Šค์— ๊ฐ’์„ ์ง€์ •ํ•˜ ๋•Œ ๋น„๋กœ์†Œ ๋นˆ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ’์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ€์—ฌํ•œ ๊ฒฝ์šฐ์™€ ๋น„์–ด์žˆ๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๋‘ ๊ฒฝ์šฐ์˜ 'undefined'์˜ ์˜๋ฏธ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ, undefined๋Š” ๊ทธ ์ž์ฒด๋กœ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๋น„์–ด์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ธด ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” ๊ณ ์œ ์˜ ํ‚ค๊ฐ’(ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„)์ด ์‹ค์กดํ•˜๊ฒŒ ๋˜๊ณ  ๋”ฐ๋ผ์„œ ์ˆœํšŒ์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ•˜๋Š” ์ˆ˜ ์—†์ด ๋ฐ˜ํ™˜ํ•˜๋Š” undefined์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ ๋‚ด์ง€ ๋ฐฐ์—ด์˜ ํ‚ค๊ฐ’ ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ข…ํ•ฉํ•ด ๋งํ•˜๋ฉด ๊ฐ’์œผ๋กœ์จ ํ• ๋‹น๋œ undefined๋Š” ์‹ค์กด ๋ฐ์ดํ„ฐ์ธ ๋ฐ˜๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋ฐ˜ํ™˜ํ•˜๋Š” undefined๋Š” ๋ง ๊ทธ๋ž˜๋„ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  2. null

    ์‚ฌ์‹ค, ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ null์ด ๋ณ„๋„๋กœ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด undefined๋ฅผ ์จ์•ผํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋น„์–ด์žˆ์Œ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์„ ๋•Œ๋Š” null์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. null์€ ์• ์ดˆ๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์šฉ๋„๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฉฐ, ์ด ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉด undefined๋Š” ์˜ค์ง "๊ฐ’์„ ๋Œ€์ž…ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ๊ฐ’"์œผ๋กœ์„œ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ null์€ ํ•œ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๋ง์”€๋“œ๋ ธ๋“ฏ, typeof null์ด object๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋–ค ๋ณ€์ˆ˜์˜ ๊ฐ’์ด null์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    const n = null;
    
    console.log(typeof n); // object
    
    console.log(n == undefined); // true
    console.log(n == null); // true
    
    console.log(n === undefined); // false
    console.log(n === null); // true

    ํƒ€์ž…์„ ๋น„๊ตํ•˜์ง€ ์•Š๋Š” ๋™๋“ฑ ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•  ๊ฒฝ์šฐ null๊ณผ undefined๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ•˜์ง€๋งŒ ํƒ€์ž…์„ ๋น„๊ตํ•˜๋Š” ์ผ์น˜ ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ฌ ๋งˆ์น˜๋ฉฐ

๋ฐ์ดํ„ฐ ํƒ€์ž… ํŒŒํŠธ๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์™€ ์‹๋ณ„์ž, ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ, ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€, ๊ฐ€๋ณ€๊ฐ’๊ณผ ๋ถˆ๋ณ€๊ฐ’์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ, undefined์™€ null๊นŒ์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์˜์—ญ์ธ ๋งŒํผ ํ™•์‹คํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ฉด, ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ์„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ƒ