ECMAScript6( 2015 )에서 새롭게 추가 되었으며
특정 객체 또는 배열의 값 다른 객체,
배열로 복제하거나 옮길 때 사용❗
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [7, 8, 9];
// concat 메소드로 arr1에 arr2랑 arr3 합친 새로운 배열 반환
const arrWrap = arr1.concat(arr2, arr3);
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(arrWrap);
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [7, 8, 9];
const arrWrap = [...arr1, ...arr2, ...arr3];
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(arrWrap);
const obj1 = {
a: 'A',
b: 'B'
};
const obj2 = {
c: 'C',
d: 'D'
};
const objWrap = {obj1, obj2};
console.log(objWrap);
👇
{
obj1: {
a: 'A',
b: 'B'
},
obj2: {
c: 'C',
d: 'D'
}
} // 출력된걸 보면 객체 자체가 들어감
const obj1 = {
a: 'A',
b: 'B'
};
const obj2 = {
c: 'C',
d: 'D'
};
const objWrap = {...obj1, ...obj2};
console.log(objWrap);
👇
{
a: 'A',
b: 'B',
c: 'C',
d: 'D'
}
const arr1 = [1, 2, 3];
const arr2 = arr1.reverse();
console.log(arr1); // [3, 2, 1]
console.log(arr2); // [3, 2, 1]
const arr1 = [1, 2, 3];
const arr2 = [...arr1].reverse();
console.log(arr1); // [1, 2, 3]
console.lot(arr2); // [3, 2, 1]
숫자 문자열 등 '원시 자료형'은 '값'을 비교함
배열, 객체 등 '참조 자료형'
👉 값 혹은 속성 비교하지 않고 '참조 되는 위치'를 비교

const obj1 = { a: 1, b: 2 };
const obj2 = { a: 1, b: 2 };
console.log(obj1 === obj2); // false
✅ 객체는 참조 자료형이라
===같은 연산자는 객체의 "주소(참조)"만 비교
그래서obj1과obj2는 생긴 건 같아도 다른 주소를 갖기에 false 나옴
👉 이걸 얕은(shallow) 비교 라고 함

Object.assign(복사될객체, 복사할객체);
const original = {
a: 1, // 👉 숫자 (원시값)
b: { inner: 2 } // 👉 객체 (참조값)
};
// 빈 객체에 original 내용 복사
const copy = object.assign({}, original);
// ✅ 원시값 바꾸면 원본 영향 없음
copy.a = 100;
// ❌ 참조된 객체는 공유됨
copy.b.inner = 999;
console.log(original.a); // 1 (안 바뀜)
console.log(original.b.inner); // 999 (원본도 바뀜!)



// 원본 배열 ( 중첩 배열 )
const original = [[1, 2], [3, 4]];
// Array.from으로 얕은 복사 ( 겉 배열만 복사됨 )
const copy = Array.from(original);
// 복사한 배열의 내부 배열 값 수정
copy[0][0] = 999;
// 원본도 바뀜! → 내부 배열은 같은 객체를 가리킴
console.log(original); // ✅ [[999, 2], [3, 4]]
console.log(copy); // ✅ [[999, 2], [3, 4]]
// 원본 배열 (중첩 배열)
const original = [[1, 2], [3, 4]];
// slice()로 얕은 복사 (겉 배열만 복사)
const copy = original.slice();
// 내부 배열 수정
copy[1][1] = 888;
// 원본도 바뀜 → 내부는 여전히 같은 객체!
console.log(original[1][1]); // 888
Object.freeze 메소드➡객체를 동결함
❌동결된 객체는 더 이상 변경 불가❌
const aObject = {
"a": "a",
"b": "b",
"cObject": { "a": 1, "b": 2 }
}
Object.freeze(aObject);
aOject.a = "c";
console.log('aObject', aObject);



겉(1단계)만 복사되고,
안쪽 객체/배열은 같은 걸 공유하기에 내부 수정 시 원본도 바뀜
depth란❓const obj = {
a: 1, // depth 1
b: {
c: 2, // depth 2
d: {
e: 3 // depth 3
}
}
};
Object depth깊지 않은 경우 :JSON.stringigy()사용
Object depth깊은 경우 :lodash라이브러리의isEqual()사용
const aObject = {
"a": "a",
"b": "b",
"cObject": { "a": 1, "b": 2 }
}
// 깊은 복사
const newAObject = JSON.parse(JSON.stringify(aObject));
console.log('aObject', aObject);
console.log('aObject', newAOject);

const aObject = {
"a": "a",
"b": "b",
"cObject": { "a": 1, "b": 2 }
}
Object.freeze(aObject); // 동결
// 깊은 복사
const newAObject = JSON.parse(JSON.stringify(aObject));
console.log('aObject', aObject);
console.log('aObject', newAOject);
aObject.cObject.a = 3; // 1을 3으로 바꿔줌
console.log('aObject', aObject);
console.log('aObject', newAOject);

const obj = {
a: 1,
b: { inner: 2 }
};
Object.freeze(obj); // 얕은 동결
obj.a = 999; // ❌ 실패 (막힘)
obj.b.inner = 999; // ✅ 성공 (안쪽은 안 막힘!)
const obj1 = { a: 1, b: 2 };
const obj2 = { a: 1, b: 2 };
// 얕은 비교
console.log(obj1 === obj2); // false
// 깊은 비교 (방법 1 - JSON.stringify)
console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true
⚠️ 단점 :
JSON.stringify( )는 순서가 다르거나undefined, 함수, 순환 참조가 있으면 실패함 😥
JSON: 데이터를 문자열로 표현하는 포맷 ( 예:{ "a": 1 })stringify: 객체를JSON문자열로 바꿔주는 함수 (JSON.stringify(obj))
npm install lodash
import _ from "lodash";
const obj1 = { a: 1, b: 2 };
const obj2 = { a: 1, b: 2 };
console.log(_.isEqual(obj1, obj2)); // true
const mushrooms1 = {
amanita: ["muscaria", "virosa"],
};
const mushrooms2 = structuredClone(mushrooms1);
mushrooms2.amanita.push("pantherina");
mushrooms1.amanita.pop();
console.log(mushrooms2.amanita); // ["muscaria", "virosa", "pantherina"]
console.log(mushrooms1.amanita); // ["muscaria"]
왜 쓰는지❓
👉 기존엔 깊은 복사하려면
JSON.parse(JSON.stringify(obj))처럼 불편했는데
함수나undefined,Date,Map,Set같은 건 복사❌
structuredClone()은 이걸 깔끔하게 해결해줌🧙♀️









