1. Optional Chaining 01 ★

{
    const person1 = {
        name: 'Ellie',
        job: {
            title: 'S/W Engineer',
            manager: {
                name: 'Bob',
            },
        },
    };

    const person2 = {
        name: 'Bob',
    };

		// 이전
    {
        function printManager(person) {
            console.log(person.job && person.job.manager && person.job.manager.name);
        }
        printManager(person1); // Bob
        printManager(person2); // undefined
    }

		// 이후
    {
        function printManager(person) {
            console.log(person.job?.manager?.name);
        }
        printManager(person1); // Bob
        printManager(person2); // undefined
    }
}

// --> person1 같은 경우 job 객체안에 manager 객체안에 name이 존재하지만
// --> person2 는 name 만 존재한다.
// ('' == false)

2. Optional Chaining 02 ★

let num1 = undefined;
let num2 = 10;
let num3 = function number() { console.log(20); };

// true  : '문자열', -1, 'false' ...
// false : -0, 0, '', null, undefined, false, NaN

num1 && console.log(num1); // num1이 true이면 console.log를 실행 -> 실행 X
num2 && console.log(num2); // num2가 true이면 console.log를 실행 -> 실행 O
num3 && concole.log(num3); // num3가 true이면 console.log를 실행 -> 실행 O

3. Nullish Coalescing Operator ★

{
    // Logical OR operator
    // false: false, '', 0, null, undefined

    // 이전
    {
        const name = 'Ellie';
        const userName = name || 'Guest';
        console.log(userName);
        // -> userName 은 name이 false 이면 'Guest' 를 할당하고,
				//    false 가 아니면 'Ellie' 를 할당한다.
    }

    {
        const name = '';
        const userName = name || 'Guest';
        console.log(userName);
        // -> '' 인 경우도 false 를 반환하기 때문에 'Guest'를 할당하게 된다.
    }

    {
        const name = 0;
        const userName = name || 'Guest';
        console.log(userName);
        // -> 0 인 경우도 false 를 반환하기 때문에 'Guest'를 할당하게 된다.
    }

    // ※ 사용자가 아무런 값도 입력하고 싶지 않을때 => ''
    // ※ 사용자가 0 을 입력하고 싶을 때 => 0
    // 이런 경우에도 무조건 'Guest' 를 반환해 버리기 때문에 문제가 발생한다.

    // 이후
    {
        const name = '';
        const userName = name ?? 'Guest';
        console.log(userName);
        // -> '' 인 경우도 false 를 반환하지 않고 name이 null 이거나 undefined 인 경우에만
				//     false 를 반환하여 'Guest' 를 할당하게 된다.
    }

    {
        const name = 0;
        const userName = name ?? 'Guest';
        console.log(userName);
        // -> 0 인 경우도 false 를 반환하지 않고 name이 null 이거나 undefined 인 경우에만
				//    false 를 반환하여 'Guest' 를 할당하게 된다.
    }
}
// ES12
name ??= 'Guest'; // name = name ?? 'Guest'