변수 호이스팅이란 변수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미함
JS 명령을 실행하는 과정은 아래와 같음
이러한 과정으로 실행되기 때문에 시각적으로 var 키워드만 호이스팅되는 것처럼 보임 하지만 모든 변수가 호이스팅을 하게 된다 . let과 cont는 undefined를 할당하기 바로 전 TDZ라는 사각지대에 머무르기 때문에 호이스팅이 안되는 것처럼 보임
함수 호이스팅이란 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미함
이것도 변수 호이스팅과 비슷해보이지만, 함수 종류에 따라 호이스팅이 불가능함
function test() { return }
const test = fucntion () { return }
🚫 하지만 호이스팅은 절대 좋은 일이 아님! 값이 할당되기 전에 호출하는 것은 비정상적인게 맞으니 최대한 호이스팅이 일어나지 않게 해야함 이러한 이유로 JSON을 만든 더글라스 크락포드도 함수 표현식 사용을 권장함
'실제 값' 을 새로운 다른 메모리에 공간에 복사하는 것을 의미
const obj = {id : 1 , name : 'jungho' };
const copyObj = {...obj}
console.log(obj === copyObj ) // false
obj.id = '1';
console.log(obj.id) // '1'
console.log(copyobj.id) // 1
const obj = {id : 1 , name : 'jungho' };
const copyObj = Object.assign({}, obj1);
console.log(obj === copyObj ) // false
obj.id = '1';
console.log(obj.id) // '1'
console.log(copyobj.id) // 1
const obj = {id : 1 , name : 'jungho' hobby : ['game' , 'movie' ] };
const copyObj = {...obj}
console.log(obj === copyObj ) // false
console.log(obj.hobby === copyobj.hobby) // true
copyObj.hobby[0] = "Exercise"
console.log(obj.hobby[0]) // "Exercise"
console.log(copyObj.hobby[0]) // "Exercise"
false
가 나와서 깊은 복사가 잘 되어 보이지만,hobby
의 주소값은 같음결론 : 완전한 깊은 복사를 편하게 구현하기 어려움
재귀함수 , JSON.parse(), JSON.stringify() 등을 이용하는 방법은 있긴함...
'주소 값'을 복사한다는 의미, 주소 값이 같기에 참조하는 실제 값도 같음
const obj = {id : 1 , name : 'jungho' };
const copyObj = obj;
console.log(obj === copyObj ) // true
const copyObj['id'] = '1'
console.log(copyObj) // {id : '1' , name : 'jungho' };
console.log(obj) // {id : '1' , name : 'jungho' };
copyObj
요소를 수정한다면 obj
요소도 동일하게 변경됨