์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ byte ๋จ์์ ์๋ณ์(๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ)๋ฅผ ํตํด ๊ตฌ๋ถํ๊ณ ์ฐ๊ฒฐ๋๋ค.
๋ณ์ a์ 1์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
let a; // (1) ๋ณ์ a ์ ์ธ
a = 1; // (2) ๋ณ์ a์ ๋ฐ์ดํฐ 1 ํ ๋น
(1)์ ๊ณผ์ ์์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ณ์ ์์ญ์ ๋น์นธ์ ํ๋ณดํ๊ณ ์๋ณ์๋ก a๋ฅผ ์ง์ ํ๋ค.
(2)์ ๊ณผ์ ์์๋ ๋ฐ์ดํฐ ์์ญ์ 1์ ์ ์ฅํ ๋ค, ๋ณ์ a๊ฐ 1์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ฒ ํ๋ค.
๋ง์ฝ ๋ณ์ a์ ๊ฐ์ 2๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด a = 2;๋ผ๋ ์ฝ๋๋ง ์์ฑํ๋ฉด ๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ฌํ ๋นํ๋ค๊ณ ํด์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ 1์ด๋ผ๋ ๊ฐ์ ๋ณํ์ง ์๋๋ค.
๋ฐ์ดํฐ ์์ญ์ ์๋ก์ด ๋น์นธ์ 2๋ฅผ ์ ์ฅํ๊ณ , ํด๋น ์ฃผ์๋ฅผ ๋ณ์ ์์ญ์ ์๋ณ์ a๊ฐ ์ฐธ์กฐํ๊ฒ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ์ฌํ ๋น์ด ์ผ์ด๋๋ค.
์ด๋, 1์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ณ์๊ฐ ์๋ค๋ฉด ํด๋น ๋ฐ์ดํฐ๋ garbage collecting์ ๋์์ด ๋์ด ์ ๊ฑฐ๋๋ค.
์ฐ์ฐ์ ํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
a *= 2;๋ผ๋ ์ฐ์ฐ์ ์งํํ ๋์๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ 1์ ๊ฐ์ ๊ณฑํ๊ธฐ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ด ์๋๋ผ ์๋ณ์ a๊ฐ ์ฐ์ฐ๊ฐ์ธ 2๋ผ๋ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค.
๋ง์ฝ a๋ฅผ ๋ณต์ฌํด์ b๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ , b์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๋ค๊ณ ํด๋ a์ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
์ฌํ ๋น ๊ณผ์ ์์ b๊ฐ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๋ค.
let b = a;
b = 2;
console.log(a); // 1
console.log(b); // 2
console.log(a === b); // false
์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ ๊ฐ์ gc๊ฐ ์ํ๋์ด ์ ๊ฑฐ๋์ง ์๋ ์ด์ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ๊ฐ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
์ฐธ์กฐํ ๊ฐ์ฒด์ ๊ฒฝ์ฐ์๋ ์๋ณ์๊ฐ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ์ง์ ์ฐธ์กฐํ๋ ๊ฒ์ด ์๋๋ผ ์ค๊ฐ์ ์๊ฐ ๋ผ๊ฒ ๋๋ค.
let obj1 = {
a: 1,
b: 2,
};
์์ ์์์ ๊ฒฝ์ฐ์๋ obj1์ด๋ผ๋ ์๋ณ์๊ฐ ๋ณ์ ์์ญ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ ๋ค, obj1์ ํ๋กํผํฐ๋ค์ ์ ์ฅํ ๋ณ์ ์์ญ์ด ์์ฑ๋๋ค.
obj1์ ๋ณ์ ์์ญ์ ์ ์ฅ๋ a, b๋ผ๋ ์๋ณ์๋ค์ ๊ฐ๊ฐ ๋ฐ์ดํฐ ์์ญ์ ์๋ 1, 2๋ผ๋ ๊ฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ค.
๋ํ ๋ฐ์ดํฐ ์์ญ์๋ a์ b ๊ฐ์ obj1์ ๋ณ์๋ค์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๊ณ , obj1์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค.
์์ obj1์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ obj2๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
let obj2 = obj1;
์ด๋ ๊ฒ ๋ณต์ฌํ๋ค๋ฉด ๊ฐ์ฒด๋ค์ ์๋์ ๊ฐ์ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ๊ฐ๊ฒ ๋๋ค.
์ด ๊ฒฝ์ฐ์๋ obj1๊ณผ obj2๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ด ๋์ผํ๋ค. ๋ฐ๋ผ์ obj1 === obj2๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ obj2์ b๊ฐ์ ๋ณ๊ฒฝํ๋ค๋ฉด, ๋์ผํ b ์๋ณ์์ ์ฐธ์กฐ๊ฐ์ด ๋ฐ๋๊ธฐ ๋๋ฌธ์ obj2 ๋ฟ๋ง์ด ์๋๋ผ obj1์ b๊ฐ๋ ๋ณ๊ฒฝ์ด ๋๋ค.
๋ํ obj1๊ณผ obj2๋ ์ฌ์ ํ ๋์ผํ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ์ ๊ฐ์ ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์๋ค.
obj2.b = 3;
console.log(obj1.b); // 3
console.log(obj2.b); // 3
console.log(obj1 === obj2); // true
์ด๋ ๊ฒ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ์ ์ฃผ์๊ฐ์ด ์๋ ๋ฐ๋ก ์๋ ๋จ๊ณ์ ์ฃผ์๊ฐ๋ง ๋ณต์ฌํ๋ ๊ฒ์ ์์ ๋ณต์ฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ๊น์ ๋ณต์ฌ๋ฅผ ํด์ผ ํ๋ค.
// (1) spread ์ฐ์ฐ์ ์ฌ์ฉ
let obj3 = { ...obj1 };
// (2) for๋ฌธ ์ด์ฉ
let copy = (obj) => {
let newObj = {};
for (let prop in obj) {
newObj[prop] = obj[prop];
}
return newObj;
};
let obj4 = copy(obj1);
obj3.b = 4;
obj4.b = 4;
console.log(obj1.b); // 3
console.log(obj3.b); // 4
console.log(obj4.b); // 4
spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ for๋ฌธ์ ์ฌ์ฉํด ์ง์ ๋ณต์ฌํ๋ obj3, obj4๋ผ๋ ์ ๊ฐ์ฒด์ obj1์ ๊ฐ๊ฐ์ ํ๋กํผํฐ๋ค์ด ์๋ก ๋ณต์ฌ๋๊ณ , ๋ฐ๋ผ์ obj1๊ณผ obj3, obj4๊ฐ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ์ ์๋ก ๋ค๋ฅด๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ์ obj1๊ณผ obj3, obj4๋ ๋ชจ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ด๊ณ , obj3์ด๋ obj4์ b ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๊ฒ ๋๋๋ผ๋ obj1์๋ ์ํฅ์ด ๊ฐ์ง ์๋๋ค.
ํ์ง๋ง ์์ ๋ฐฉ๋ฒ๋ค์ ์ฌ์ฉํด์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋๋ผ๋, ์๋์ obj ๊ฐ์ฒด์ ๊ฐ์ด ์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ๋ ๊ฒฝ์ฐ์๋ ์์ ๋ณต์ฌ๋ง ์งํ๋๋ค.
let obj = {
a: 1,
b: [1, 2, 3],
};
๊ฐ์ฒด์ ํ์์ ์๋ ์ฐธ์กฐํ ๋ฐ์ดํฐ ์ญ์ ๊น์ ๋ณต์ฌ๋ฅผ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊น์ ๋ณต์ฌ๋ ์์ ๋ณต์ฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํด์ ๊ธฐ๋ณธํ ํ์ ์ ํ๋กํผํฐ์ ์ฃผ์๊ฐ์ ์์๋ผ ๋๊น์ง ํ๊ณ ๋๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด ๋๋ค.
let deepCopy = (target) => {
let result = {};
if (typeof target === 'object' && target !== null) {
for (let prop in target) {
result[prop] = deepCopy(target[prop]);
}
} else {
result = traget;
}
return result;
};
let newObj1 = deepCopy(obj);
๊น์ ๋ณต์ฌ๋ฅผ ์งํํ๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ๋ ์๋ค.
๊ฐ์ฒด๋ ๋ฐฐ์ด์ ํต์งธ๋ก JSON String์ผ๋ก ๋ณํ์ํจ ๋ค ๋ค์ JS ์๋ฃํ์ผ๋ก ํ์ฑ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
let newObj2 = JSON.parse(JSON.stringify(obj));
์ ๋ง ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ๋ณต์ฌ๊ฐ ์งํ๋์ง๋ง, prototype๊ณผ ๊ฐ์ด ์จ๊ฒจ์ง ํ๋กํผํฐ๋ ์ฌํ ๋ฉ์๋ ๋ฑ์ JSON์ผ๋ก ๋ณ๊ฒฝ์ด ๋ถ๊ฐํด์ ๊ทธ๋ฅ ๋ฌด์๋๊ธฐ ๋๋ฌธ์ ํญ์ ์ฌ์ฉํ ์๋ ์๋ค.
Reference : ์ ์ฌ๋จ, โ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธโ, ์ํค๋ถ์ค, 2019