🌟 호이스팅(Hoisting)?
- 코드가 실행하기 전 변수선언/함수선언이 해당 스코프의 최상단으로 끌어 올려진 것 같은 현상을 말한다. 자바스크립트 엔진은 코드를 실행하기 전 실행 가능한 코드를 형상화하고 구분하는 과정(실행 컨텍스트를 위한 과정)을 거친다. 자바스크립트 엔진은 코드를 실행하기 전 실행 컨텍스트를 위한과정에서 모든 선언(var, let, const, function, class)을 스코프에 등록한다. 코드 실행 전 이미 변수선언/함수선언이 저장되어 있기 때문에 선언문보다 참조/호출이 먼저 나와도 오류 없이 동작한다. (정확히는 var 키워드로 선언한 변수와 함수 선언문일 경우 오류 없이 동작한다. 이는 선언이 파일의 맨 위로 끌어올려진 것 처럼 보이게 한다.) 실행 컨텍스트는 실행 가능한 코드가 실행되기 위해 필요한 환경을 의미하고 실행되기전 이러한 실행 컨텍스트 과정(코드를 구분하는 과정)을 거친다. 자바스크립트의 모든 선언에는 호이스팅이 일어난다. 그런데 let, const, class를 이용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작한다.
// 변수 선언 및 초기화
var a = 1;
let b = "Hello World!";
// 상수 선언 및 초기화
const d =1;
🌟 원시 타입(primitive type)과 참조 타입(reference type)?
- 원시 타입: 할당될 때 변수에 값 자체가 담기는 자료형
ex) string, number, bigint, boolean, undefined, symbol- 참조 타입: 원시 타입외의 모든 타입, 할당될 때 보관함의 주소가 담기는 자료형
ex) Object, Array, Function
// if문
if(false) {
console.log("이 구문은 실행되지 않습니다.");
}
else if(false) {
console.log("이 구문은 실행되지 않습니다.");
}
else {
console.log("이 구문은 실행됩니다.");
}
// for문
for(var i=0; i<property_list.length;i++) {
var proName = property_list[i];
console.log("\t", proName, ": ", obj[proName]);
}
// 다양한 배열 선언 및 초기화
const arr1 = new Array();
const arr2 = [];
const arr3 = [1,2,3,4,5];
const arr4 = new Array(5);
const arr5 = new Array(5).fill(5);
const arr6 = Array.from(Array(5), function (v, k) {
return k+1;
})
// 배열 길이는 직접 수정이 가능하다 (but, 권장하지 않는다)
arr3.length = 10;
// 배열 요소를 하나로 합치기
console.log(arr5.join(", "));
// 배열을 거꾸로 반환, 한 번 사용하면 원래 있던 배열에도 영향이 감
console.log(arr3.reverse());
// 배열 합치기
console.log(arr3.concat(arr5));
// 배열 끝부분에 요소 추가하고 삭제하기
arr1.push(7);
arr1.pop();
// 배열 첫부분에 요소 삭제하고 추가하기
arr1.shift();
arr1.unshift(10);
// 배열 자르기
arr3.slice(2,7); // 원본 변화 없음
arr3.splice(2,2); // 원본 변화
// 배열의 순회 (기존)
for(let i=0; i <8; i++) {
console.log(arr3[i]);
}
// 배열의 순회 (for of)
for(const item of arr3) {
console.log(item);
}
// 객체처럼 사용하는 배열
arr1["key"] = "value";
console.log(arr1.length); // 길이에는 변화가 없다
// 다양한 객체 생성
const obj1 = new Object();
const obj2 = {};
const obj3 = { name: "박영규", age: 26};
console.log(obj1);
console.log(obj2);
console.log(obj3);
// 객체에 키와 값 추가하기
obj3["email"] = "dudrb5260@naver.com";
obj3.phone = "01012345678"
console.log(obj3);
// 요소 삭제하기
delete obj3.phone;
console.log(obj3);
// 키 존재 여부 확인하기
console.log("email" in obj3);
console.log("phone" in obj3);
// 키 혹은 값만 배열의 형태로 나타내기
console.log(Object.keys(obj3));
console.log(Object.values(obj3));
// 객체 순회
for(const key in obj3) {
console.log(key, obj3[key]);
}
var num = 1; // 전역 스코프
function print() { // 지역(함수) 스코프
var num = 2;
console.log(a);
}
print(); // 2 출력, 함수 안의 num 값이 함수 안에서만 적용됨
console.log(a); // 1 출력, 함수 바깥의 num값이 적용됨
❗ 클로저는 복잡한 개념이니 추후 자세히 설명한다.