์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
let aaa = "์ฒ ์"
let bbb = aaa
console.log(aaa) // ์ฒ ์
console.log(bbb) // ์ฒ ์
์ฌ๊ธฐ์ ๋ณต์ฌ๋ณธ์ธ bbb์ ๊ฐ์ ์ฌํ ๋นํ๋ฉด, ์๋ณธ์ธ aaa์ ๊ฐ์ ๋ณํ์ง ์๊ณ , bbb์ ๊ฐ๋ง ๋ฐ๋๋ ๊ฒ์ ์ ์ ์๋ค.
bbb = "์ํฌ"
console.log(aaa) // ์ฒ ์
console.log(bbb) // ์ํฌ
ํ์ง๋ง ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋ณต์ฌ๋ณธ์ ๋ฐ๊พธ๋ฉด ์๋ณธ์ด ๋ฐ๋๋ค.
let child1 = {
name: "์ฒ ์",
age: 8,
school: "๋ค๋์ฅ์ด๋ฑํ๊ต"
}
let child2 = child1
child2 // {name: '์ฒ ์', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
// ๋ฐ์ดํฐ ์ฌํ ๋น
child2.name = "์ํฌ"
child1 // {name: '์ํฌ', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
child2 // {name: '์ํฌ', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋ฌธ์์ด, ์ซ์, boolean ๊ฐ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ณ์์ ๊ฐ์ ํ ๋นํ๋ฉด ๊ฐ ์์ฒด๊ฐ ์๋, ๊ฐ์ ๋ด๊ณ ์๋ ์ฃผ์
๊ฐ ์ ์ฅ๋๋ค๋ ํน์ฑ์ด ์๋ค!
์๋ณธ๊ณผ ๋ณต์ฌ๋ณธ์ด ๊ฐ๊ฐ ๊ฐ์ ์ฃผ์
๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์, child2์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด child1์ ๊ฐ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋ณต์ฌํ ์ ์์๊น? ์ฌ์ค ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ค๋ ๊ฐ๋ ์ ์กด์ฌํ์ง ์๋๋ค. ์๋ณธ ๊ฐ์ฒด์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์๋ก ๋ง๋ค ์ ์์ ๋ฟ์ด๋ค!
// child3์ child2 ๋ณต์ฌ
let child3 = {
name: child2.name,
age: child2.age,
school: child2.school
}
child3 // {name: '์ํฌ', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
// child3์ name ๋ณ๊ฒฝ
child3.name = "ํ์ด"
child3 // {name: 'ํ์ด', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
child2 // {name: '์ํฌ', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
์์ ๊ฐ์ด child2์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ child3์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ง๋ค๊ณ , child3์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด, child2์ child3์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ
๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์์์ child2๋ฅผ ๋ณต์ฌํ์ฌ child3์ ๋ง๋ค ๋์ฒ๋ผ ์๋ณธ child2์ ๋ชจ๋ ๊ฐ์ ๋ฐ๋ก๋ฐ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ด๋ค. ๊ฐ์ฒด์ ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ๊ทธ๋ด ๊ฒ์ด๋ค. ์ด๋ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์คํ๋ ๋ ์ฐ์ฐ์
์ด๋ค. ์คํ๋ ๋ ์ฐ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์จ์ค ์ ์๋ค.
let child3 = {
name: child2.name,
age: child2.age,
school: child2.school
}
// ์คํ๋ ๋ ์ฐ์ฐ์ ์ฌ์ฉ!
let child3 = {...child2}
let child4 = {
...child2
}
child4 // {name: '์ํฌ', age: 8, school: '๋ค๋์ฅ์ด๋ฑํ๊ต'}
์ฆ child4์ ๊ฐ์ ๋ณ๊ฒฝํด๋ child2์ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
profile2๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ profile1์ name ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ์๋๋, profile1์ name๋ง ๋ฐ๋๊ณ , profile2์ name์ ๊ทธ๋๋ก์ด๋ค.
let profile1 = {
name: "์ฒ ์",
age: 8,
school: "๊ณต๋ฃก์ด๋ฑํ๊ต",
hobby: {
first: "์์",
second: "ํ๋ก๊ทธ๋๋ฐ"
}
}
let profile2 = {
...profile1
}
profile1.name = "์ํฌ"
profile1
// {name: '์ํฌ', age: 8, school: '๊ณต๋ฃก์ด๋ฑํ๊ต', hobby: {โฆ}}
profile2
// {name: '์ฒ ์', age: 8, school: '๊ณต๋ฃก์ด๋ฑํ๊ต', hobby: {โฆ}}
์ํฌ์ ์ฒซ ๋ฒ์งธ ์ทจ๋ฏธ๋ฅผ ์ถ๊ตฌ๋ก ๋ฐ๊ฟ๋ณด์.
profile1.hobby.first = "์ถ๊ตฌ"
profile1
// {name: "์ํฌ", age: 8, school: "๊ณต๋ฃก์ด๋ฑํ๊ต",
// hobby: {
// first: "์ถ๊ตฌ", second: "ํ๋ก๊ทธ๋๋ฐ"}
// }
profile2
// {name: "์ฒ ์", age: 8, school: "๊ณต๋ฃก์ด๋ฑํ๊ต",
// hobby: {
// first: "์ถ๊ตฌ",
// second: "ํ๋ก๊ทธ๋๋ฐ"
// }
// }
๋ถ๋ช ์ํฌ์ ์ฒซ ๋ฒ์งธ ์ทจ๋ฏธ๋ง ๋ณ๊ฒฝํ๋๋ฐ ์ฒ ์์ ์ฒซ ๋ฒ์งธ ์ทจ๋ฏธ๊น์ง ๋ฐ๋์ด๋ฒ๋ ธ๋ค. hobby๋ผ๋ ๊ฐ์ฒด๋ ์ฃผ์๋ก ๊ฐ์ด ์ ์ฅ๋๋ค. profile1์ hobby ๊ฐ์ฒด์ profile2์ hobby ๊ฐ์ฒด๋ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ๊ฐ์ด ๋ฐ๋์ด๋ฒ๋ฆฐ๋ค.
์ด์ฒ๋ผ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ๋ณต์ฌ๋ ์์ ๋ณต์ฌ(Shallow-Copy)๋ผ๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํ๋ ๋ ์ฐ์ฐ์๋ก ๋ณต์ฌํด์ฃผ์ง ๋ชปํ๋ ๋ถ๋ถ๊น์ง ๋ณต์ฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ๊ฐ์ฒด๋ ๋ฐฐ์ด์ JSON.stringify
๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์์ด๋ก ๋ง๋ค์ด์ค ํ์, ๋ค์ JSON.parse
๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด ํํ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค!