let a = 'age';

const user = {
    name : 'Malza',
    [a] : 10, // [a] 는 a 가 아니라 a 에 할당 되어 있는 age 가 들어간다.
							// 이를 Computed property 라고 한다.
}

const user = {
    [1 + 5] : 6,
    ["안녕" + "하세요"] : "Hello",
}
console.log(user); // {6: 6, 안녕하세요: "Hello"}
식 자체를 넣는 것도 가능하다.

function makeObj(key, val){
    return {
        [key] : val
    }
}

const obj = makeObj("나이", 30);

console.log(obj); // 어떤 것이 key 값이 될 지 모를 때 유용';
Object.assign()

let a = 'age';

const user = {
    name : 'Malza',
    [a] : 10,
}
const newUser = user; // 이건 새로운 객체를 만들어 낸 것일까?
위와 같이 할 경우 같은 객체를 두개가 가리키고 있는 거 뿐이다.
newUser.name = 'mike'; // newUser 의 name 을 바꿨지만 user 의 이름도 바뀐다. 결국 같은 것을 가리키기 때문이다.

const newUser = Object.assign({}, user); // 이렇게 해 주면 newUser 는 새로운 객체를 가진다.
const newUser = Object.assign({gender : 'male'}, user); // gender 를 추가로 가지는 newUser
const newUser = Object.assign({name : 'mike'}, user); // key 가 같다면 user 것으로 덮어씌운다.

const user = {
    name : 'Malza'
}
const info1 = {
    age : 10,
}
const info2 = {
		name : 'mike', // 이게 있으면 name 이 같기 때문에 덮어 씌워질 것이다.
    gender : 'female',
}
여러개도 합칠 수 있다.
const newUser = Object.assign(user, info1, info2); // {name: "Malza", age: 10, gender: "female"}
만약 뒤의 값에 겹쳐지는 key가 있으면 덮어씌워진다.

console.log(Object.keys(newUser));  // Object 의 key를 배열로 반환한다. ["name", "age", "gender"]
console.log(Object.values(newUser)); // Object 의 value 를 반환한다. ["Malza", 10, "female"]
console.log(Object.entries(newUser)); // Object 의 key와 value 반환한다.
(3) [Array(2), Array(2), Array(2)]
0: (2) ["name", "Malza"]
1: (2) ["age", 10]
2: (2) ["gender", "female"]
key 와 value 를 쌍으로 묶어서 배열로 준다.

const arr = [
    ['name', 'Mike'],
    ['age', '23'],
    ['gender', 'male'],
]
배열을 객체로 바꿔 줄 수 도 있다.
const result = Object.fromEntries(arr);
console.log(result); // {name: "Mike", age: "23", gender: "male"}