// Shorthand property names
{
    const ellie1 = {
        name: 'Ellie',
        age: '18'
    };

    const name = 'Ellie';
    const age = '18';

    const ellie2 = {
        name: name,
        age: age
    }; // key 와 value 가 같으면 하나로  작성 가능하다.

    const ellie3 = {
        name,
        age
    };

    console.log(ellie1, ellie2, ellie3); // 모두 같은 값 {name: "Ellie", age: "18"}
}

//Destructuring Assignment
{
    //object
    const student = {
        name: 'Anna',
        level: 1
    };

    {
        const name = student.name;
        const level = student.level;
        console.log(name, level);
    }

    {
        const { name, level } = student; // key 와 value 가 맞게 할당된다.
        console.log(name, level); // Anna 1
        //이름을 바꾸고 싶어! 다음과 같이 하자
        const { name: changeName, level: changeLevel } = student;
        console.log(changeName, changeLevel); //Anna 1
    }

    //array
    const animals = ['😀', '😁'];

    //
    {
        const first = animals[0];
        const second = animals[1];
        console.log(first, second); // 😀 😁
    }

    {
        const [first, second] = animals;
        console.log(first, second); // 😀 😁
    }
}

//Spread Syntax

{
    const obj1 = { key: 'key1'};
    const obj2 = { key: 'key2'};
    const array = [obj1, obj2];

    //array copy
    const copy = [...array]; //array 에 있는 item 하나하나 씩을 낱개로 가져와서 복사해 준다.
    console.log(array, copy); // 동일한 결과 값

    const copy2 = [...array, {key: 'key3'}];
    console.log(array, copy, copy2); // copy2 는 key3 가 추가되었다.

    //여기서 잠깐! copy2 와 copy 는 별개인가?
    // 실제로 obj1 이라는 변수는 object 자체를 가리키지 않는다. object 의 주소를 가지고 있다.
    // 그렇기 때문에 복사 해 올 때도 주소를 복사 해 온다. 그럼 당연히 같은 곳을 가리킬 것이다.
    obj1.key = 'changeKey1';
    console.log(array, copy, copy2); // 모두 changeKey1 으로 바꿔버린다.

    // object copy
    const obj3 = {...obj1};
    console.log(obj3);

    // array concatenation
    const fruits1 = ['😀', '😁'];
    const fruits2 = ['😂', '🤣'];
    const concat = [...fruits1, ...fruits2];
    console.log(concat); // 4개 다 뜬다.

    //object merge
    // const face1 = { face1: '😎'};
    // const face2 = { face2: '😍'};
    // const face3 = {...face1, ...face2};
    //console.log(face3); // 둘이 합쳐졌다. 만약! key 가 동일한 obj 를 합치게 되면 뒤에 오는애가 앞에 key를 덮어 버린다.
    const face1 = { face: '😎'};
    const face2 = { face: '😍'};
    const face3 = {...face1, ...face2};
    console.log(face3); // 😍 만 출력
}

//Defalut parameters
{
    {
        function printMessage(message) {
            console.log(message);
        }

        printMessage('hello');
        printMessage(); // undefined
        //이제 정상적이지 않은 arg가 넘어와도 잘 넘어갈 수 있게 defalut 해 주자.

        function printMessage2(message = 'default message') {
            console.log(message);
        }
        printMessage2('hello');
        printMessage2(); //default message 출력
    }
}

//Ternary operator
{
    const isCat = true;
    {
        let component = isCat ?  '😺' : '💩';
        //console.log(component);
        console.log(isCat ? '😺' : '💩');
    }
}

//Template Literals

{
    const mountain = '🏔';
    const temparature = '16';
    console.log(
        `Let's go ${mountain}! Today temparature is ${temparature}`
    );
}

//Optional Chaining (ES11)
{
    const person1 = {
        name: 'Ellie',
        job: {
            title: 'S/W Engineer',
            manager: {
                name: 'Bob',
            },
        },
    };
    const person2 = {
        name: 'Bob'
    }

    function printManager(person) {
        console.log(person.job?.manager?.name); // 코드가 엄청 짧아진다.
    }
    printManager(person1);
    printManager(person2); // undefined
}

//Nullish Coalscing Operator (ES11)
{
    //기존
    {
        const name = 'malza';
        const userName = name || 'Guest'; // name 이 있으면 name인 malza, 없으면 guest 가 될 것이다.
        console.log(userName); //  malza
    }
    
    //그런데 다음을 보자
    {
        const name = 0;
        const userName = name || 'GUEST'; // 0 이 false 로 간주된다. 그래서?!
        console.log(userName); // GUEST 가 나온다.
    }
    {
        const name = '';
        const userName = name || 'GUEST'; // '' 이 false 로 간주된다. 그래서?!
        console.log(userName); // GUEST 가 나온다.
    }

    { // 그래서 나온 방식이 '??' !!
        const name = '';
        const userName = name ?? 'Guest';
        console.log(userName); // 아무것도 안나온다.

        const num = 0;
        const message = num ?? 'undefined'
        console.log(message); // 0 출력
    }

}