const info = {
firstName: "JooAm",
lastName: "Lee",
age: 27,
career: null,
};
console.log(info.firstName, info["age"]);
JooAm 27
๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ด key์ value ํํ๋ก ์ด๋ฃจ์ด์ง ์ฐธ์กฐ ํ์ ์ ๋ฐ์ดํฐ์ด๋ค.
ํด์ ๋งต ๊ธฐ๋ฅ์ด ํ์ํ ๋ ํนํ ์ ์ฉํ๋ค. ๋ด๋ถ ์์ฑ์ ์ ๊ทผํ ๋๋ ์์ ๊ฐ์ด ์ ํ๊ธฐ๋ฒ์ด๋ ๋๊ดํธ ํ๊ธฐ๋ฒ์ ์ด์ฉํ ์ ์๋ค.
const arr = [1, 2, 3, 4, 5];
const obj = { id: 1234, name: "joo" };
const obj2 = { age: 27, name: "Lee" };
console.log(...arr);
console.log({ ...obj } === obj);
console.log({ ...obj, ...obj2 });
1 2 3 4 5
false
{ id: 1234, name: 'Lee', age: 27 }
์ ๊ฐ ์ฐ์ฐ์(spread operator)๋ iterableํ ์์์ ์ฌ์ฉํ ์ ์๋ ๋ฌธ๋ฒ์ด๋ค.
์ ์ฒ๋ผ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๊ฐ๊ฐ ์ ๊ฐํด์ ๋์ดํ๊ฑฐ๋, ๊ฐ์ฒด์ ์์ฑ๋ค์ ์ด๊ฑฐํ์ฌ ์๋ก์ด ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํ ๋นํ ์ ์๋ค.
const obj = { id: 1234, name: "joo", age: 27, carrer: null };
const arr = [1, 2, 3, 4, 5];
const [a, b, ...rest] = arr;
const { name, id, ...objRest } = obj;
const { name: newName, id: newId, hi = "hello" } = obj;
console.log(a, b, rest);
console.log(name, id, objRest);
console.log(newName, newId, hi);
1 2 [ 3, 4, 5 ]
joo 1234 { age: 27, carrer: null }
joo 1234 hello
์ ๊ฐ ์ฐ์ฐ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌ์กฐ ๋ถํด ํ ๋น๋ ์ ์ฉํ ๋ฌธ๋ฒ ์ค ํ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ ๊ฐ์ฒด์ ํค์ ๊ฐ๊ฐ ์ ๊ทผํด์ ํ ๋นํ๋ ๊ฒ์ด ์๋๋ผ ํ๋์ ๋ฌธ์ฅ์ผ๋ก ํธํ๊ฒ ๋ณ์์ ํ ๋นํ ์ ์๋ค.
์ด๋ ์ ๊ฐ ์ฐ์ฐ์์ ๋น์ทํ ๋ฌธ๋ฒ์ธ ๋๋จธ์ง ์ฐ์ฐ์์ ํจ๊ป ํ์ฉํ๋ฉด ๋ฐ๋ก ์ง์ ํ์ง ์์ ์์๋ค ๋ํ ๋ฌถ์ด์ ํ ๋นํ ์ ์๋ค.
๋ณ์์ ์ด๋ฆ์ ๊ฐ์ฒด์ key ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์๊ฐ ์์๋ก ์ง์ ํ ์๋ ์๊ณ default ๊ฐ๋ ์ ํ ์ ์์ผ๋ ์ ์ ํ๊ฒ ํ์ฉํ๋ค๋ฉด ์ ๋ง ํธ๋ฆฌํ ๋ฌธ๋ฒ์ด๋ค.
const info = {
firstName: "JooAm",
lastName: "Lee",
age: 27,
career: null,
};
const newInfo = info;
const realNewInfo = { ...info };
console.log(newInfo === info);
newInfo.lastName = "Kim";
console.log(info);
console.log(realNewInfo === info);
realNewInfo.lastName = "Lee";
console.log(info);
true
{ firstName: 'JooAm', lastName: 'Kim', age: 27, career: null }
false
{ firstName: 'JooAm', lastName: 'Kim', age: 27, career: null }
๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋์๋ ์ฝ๊ฐ์ ์ฃผ์์ฌํญ์ด ํ์ํ๋ค. ๊ฐ์ฒด๋ ์ฐธ์กฐ ํ์ ์ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ๋๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ฒ๋ผ ์ ๊ฐ ์ฐ์ฐ์๋ Object์ Assign ๋ฉ์๋๋ฅผ ํ์ฉํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์์ผ๋ก ํ ๋นํด์ผํ๋ค.
ํ์ง๋ง ์ด๊ฒ๋ ์์ ํ ํด๊ฒฐ์ฑ ์ ์๋๋ค. ์ด๊ฒ์ ์์ ๋ณต์ฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ๊ฒ๋ถ๋ถ๋ง ๋ณต์ฌํ๋ค. ์ด ๋ง์ ์๋ฏธ๋ฅผ ๋ฐ์ ์์์์ ์ดํด๋ณด์.
const info = {
firstName: "JooAm",
lastName: "Lee",
age: 27,
career: null,
skills: {
language: ["javascript, c, c++, python"],
tools: ["React, Redux, Koa"],
skillToLearn: ["TypeScript, MSW, Express, MongoDB"],
},
};
const newInfo = info;
const realNewInfo = { ...info };
realNewInfo.age = 30;
realNewInfo.skills.hi = "Hello";
console.log(newInfo);
{
firstName: 'JooAm',
lastName: 'Lee',
age: 27,
career: null,
skills: {
language: [ 'javascript, c, c++, python' ],
tools: [ 'React, Redux, Koa' ],
skillToLearn: [ 'TypeScript, MSW, Express, MongoDB' ],
hi: 'Hello'
}
}
์ ๊ฐ ์ฐ์ฐ์์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ํ ๋นํ realNewInfo๋ ๊ธฐ์กด์ info์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ค๋ฅด๋ค๋ ๊ฑธ ์ด์ ์ ํ์ธํ๋ค.
ํ์ง๋ง realNewInfo ๋ด๋ถ์ ๋๋ค๋ฅธ ์ฐธ์กฐ ๋ฐ์ดํฐ ํ์ ์ด ์์ ๊ฒฝ์ฐ๊ฐ ๋ฌธ์ ๋ค.
์์์ realNewInfo์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋๋ฐ newInfo์ ๊ฐ์ด ๋ฐ๋์๋ค. skills์ ๋งคํ ๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒ๋ถ๋ถ๋ง ๋ณต์ฌํ์ ๋ฟ ์์์๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ํํ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌํ๋ ํจ์๋ฅผ ๊ตฌํํ๋๊ฐ, ์๋๋ฉด JSON ๊ฐ์ฒด์ ๋ฉ์๋๋ค์ ํ์ฉํด์ผํ๋ค.
// mock.json
{
"name": "lee",
"age": 27,
"carrer": null,
"graduated": true
}
JSON์ ๋ฐ์ดํฐ ์ ์ก์ ์ํ format ์ค ํ๋๋ค. ์์์ ๋ณผ ์ ์๋ฏ์ด key-value ํํ์ด์ง๋ง ๋ฌธ์์ด ํํ๋ก ์ ์ก๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์์ฃผ ์ ์ฉํ๋ค. JSON์ ๊ฐ์ผ๋ก ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, null, ๋ค๋ฅธ ๊ฐ์ฒด(๋ฐฐ์ด๋)๋ฅผ ํฌํจํ ์ ์๋ค.
์์ ์์์์๋ {}๋ก ๋ฌถ์ด ๊ฐ์ฒด์ฒ๋ผ ํํํ์ง๋ง ๋๊ดํธ๋ฅผ ์ด์ฉํด ๋ฐฐ์ด๋ก๋ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
const mock = require("./mock.json");
// node js ํ๊ฒฝ์์ ์คํํ๊ธฐ ๋๋ฌธ์ require๋ก ๋ถ๋ฌ์ด
console.log(mock);
const str = JSON.stringify(mock);
console.log(str);
console.log(typeof str);
console.log(JSON.parse(str));
console.log(typeof JSON.parse(str));
{ name: 'lee', age: 27, carrer: null, graduated: true }
{"name":"lee","age":27,"carrer":null,"graduated":true}
string
{ name: 'lee', age: 27, carrer: null, graduated: true }
object
์๋ฐ์คํฌ๋ฆฝํธ๋ JSON ๊ฐ์ฒด๋ฅผ ํตํ parse์ stringify ๋ฉ์๋๋ฅผ ์ง์ํ๋ค. stringify ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ ๊ฐ์ด JSON ํํ๋ก ๋ณํ๋๋ค.
parse ๋ฉ์๋๋ ๋ฐ๋๋ก JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์ฒ๋ผ ๋ณํํด์ค๋ค.
์์ ์์์์ ๋ณผ ์ ์๋ฏ์ด ๋์ ํ์ ์ ํ์ธํ๋ฉด ๊ฐ๊ฐ string, object์ธ๊ฑธ ํ์ธํ ์ ์๋ค.
const info = {
firstName: "JooAm",
lastName: "Lee",
age: 27,
career: null,
skills: {
language: ["javascript, c, c++, python"],
tools: ["React, Redux, Koa"],
skillToLearn: ["TypeScript, MSW, Express, MongoDB"],
},
};
const newInfo = info;
const realNewInfo = JSON.parse(JSON.stringify(info));
realNewInfo.age = 30;
realNewInfo.skills.hi = "Hello";
console.log(newInfo);
{
firstName: 'JooAm',
lastName: 'Lee',
age: 27,
career: null,
skills: {
language: [ 'javascript, c, c++, python' ],
tools: [ 'React, Redux, Koa' ],
skillToLearn: [ 'TypeScript, MSW, Express, MongoDB' ]
}
}
์๊น์ ์์ ๋ณต์ฌ ์์๋ฅผ ๋ค์ ๋ณด์. ์ง๊ธ์ ์ ๊ฐ ์ฐ์ฐ์๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด์ง ์๊ณ , JSON ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํ์ฉํ๊ณ ์๋ค.
๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋ณธ์ ์ฐธ์กฐํ๋ newInfo์ ๊ฐ์ด ์ ํ ๋ณํ์ง ์์๋ค.
๋ง์ฝ ์ด๊ฒ์ผ๋ก ํด๊ฒฐ๋๋ค๋ฉด lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ deep clone์ด๋ ์ฌ๊ท์ ์ธ ๋ณต์ฌ ํจ์๋ ํ์์๋ค. ํด๊ฒฐ์ด ๋๋ค๋ฉด ๋ง์ด๋ค... ๐
const myObj = {
name: "Jooam",
carrer: null,
age: 27,
sayHello: function () {
console.log("Hello I'm", this.name);
},
};
myObj.sayHello();
const newObj = JSON.parse(JSON.stringify(myObj));
console.log(newObj);
Hello I'm Jooam
{ name: 'Jooam', carrer: null, age: 27 }
์์ ๊ฐ์ ์ํฉ์ด ์์ธ ์ค ํ๋๋ค. ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ ์ํ๋๋ฐ, JSON ๋ฉ์๋๋ฅผ ๊ฑฐ์น๊ณ ๋๋ ์ ์ํ ๋ฉ์๋๊ฐ ์ฌ๋ผ์ก๋ค!
์๋์์ ๋ฒ์ด๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ผ ์๋ ์์ผ๋ ์ ์ ํ๊ฒ ํ๋จํ์ฌ ์ด๋ค ๋ฐฉ์์ผ๋ก copyํ ์ง ํ๋จํด์ผํ๋ค.
Symbol ํ์ ๋ stringify ๋ฉ์๋์์ ๋ฌด์๋๋ค๊ณ ํ๋๋ฐ, Symbol ํ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํด ๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ฒ ๋ค.