예시)
let originalArray = [1, 2, 3];
// 또는 let shallowCopy = [...originalArray];
let shallowCopy = originalArray.slice();
shallowCopy[0] = 5;
console.log(originalArray); // [1, 2, 3]
console.log(shallowCopy); // [5, 2, 3]
예시)
let originalArray = [[1], [2], [3]];
let deepCopy = JSON.parse(JSON.stringify(originalArray));
deepCopy[0][0] = 5;
console.log(originalArray); // [[1], [2], [3]]
console.log(deepCopy); // [[5], [2], [3]]
JSON.stringify()를 통해 객체를 문자열로 변환하고, 다시 JSON.parse()를 사용하여 문자열을 객체로 변환함으로써 깊은 복사를 할 수 있다. 하지만 이 방법은 모든 데이터를 복사하기 때문에 성능에 영향을 줄 수 있다. 또한, 함수나 순환 참조된 객체 등을 복사할 수 없다.
// var
console.log(x); // undefined (호이스팅)
var x = 10;
console.log(x); // 10
// let
console.log(y); // ReferenceErrorinitialization
let y = 20;
console.log(y); // 20
// const
console.log(z); // ReferenceErrorinitialization
const z = 30;
console.log(z); // 30
Temporal Dead Zone의 약자(일시적 사각지대)
let과 const 변수가 선언되기 전에 접근하려고 할 때 발생하는 현상 -> 변수가 선언되었지만 초기화되기 이전의 시점을 나타낸다.
TDZ 특성
접근 시 오류 발생: TDZ 내에서 변수에 접근하면 ReferenceError가 발생한다. -> 변수가 아직 초기화되지 않았기 때문에 해당 변수에 접근할 수 없음.
호이스팅: let이나 const로 선언된 변수는 호이스팅된다. -> 해당 변수의 선언은 스코프의 최상단으로 끌어올려진다. 하지만 초기화는 호이스팅되지 않으며, TDZ 내에서 변수에 접근하면 ReferenceError가 발생한다.
블록 스코프 내에서 적용: TDZ는 블록 스코프에서만 적용된다. -> let이나 const로 선언된 변수는 해당 블록 내에서만 TDZ에 영향을 받는다.
🙏🏻TDZ는 코드의 안전성을 높이고 실수를 줄이기 위해 도입된 개념으로, 변수의 사용을 명시적으로 초기화한 후에만 안전하게 접근할 수 있도록 한다.