Promise와 Callback 차이
⭐️Callback은 함수를 다른 함수의 인자로 전달하여 비동기 작업이 완료되면 호출될 콜백 함수를 정의하는 방식이다. 예를 들면 setTimeout 함수는 첫 번째 인자로 전달된 콜백 함수를 일정 시간이 지난 후 호출한다.
⭐️Promise는 비동기 작업의 결과를 나타내는 객체이다. Promise는 작업이 성공하면 이행(resolve)상태가 되며 결과 값을 가지고 처리를 완료한다. 반면 작업이 실패하면 거부(reject)상태가 되며 실패 이유를 나타내는 오류 객체를 반환한다.
--> Promise는 콜백 함수보다 가독성이 좋고, 비동기 작업이 여러 단계로 이루어져도 코드 작성이 쉽다. 또한 Promise.all이나 Promise.race같은 메소드를 사용해 여러 Promise를 동시에 처리하고 조합할 수 있다.
콜백 지옥을 해결하는 방법
Promise를 사용한 비동기 통신과 async, await를 사용한 비동기 통신의 차이
⭐️ Promise를 사용한 비동기 통신은 'then()'과 'catch()' 메서드를 사용하여 비동기 작업의 결과를 처리한다. 이를 통해 비동기 작업이 완료되면 콜백 함수가 호출되어 처리 결과를 전달한다. 여러개의 비동기 작업을 연결할 경우 콜백 지옥이 발생할 수 있다.
⭐️ async/await를 사용한 비동기 통신은 async 함수와 await 키워드를 사용하여 비동기 작업의 결과를 처리한다. async함수는 항상 Promise를 반환하며, await 키워드를 사용하여 Promise가 처리될 때까지 대기할 수 있다. 또한 try-catch문과 함께 오류 처리를 쉽게 할 수 있다.
var, let, const 차이
⭐️ var는 ES5 이전의 JavaScript에서 사용되었고, 변수를 선언하고 값을 할당할 수 있다. 하지만 var는 함수 스코프를 가지며, 변수의 유효 범위가 해당 함수 내에서만 적용된다. 또한 변수를 중복해서 선언할 수 있고, 값이 없이 선언할 수 있다.
⭐️ let과 const는 ES6에서 추가된 변수 선언 키워드이다. let과 const는 블록 스코프를 가지며, 변수의 유효 범위가 해당 블록 내에서만 적용된다. 변수를 중복해서 선언할 수 없고, const는 값이 없이 선언할 수 없다.
-> let은 값의 변경이 가능하고, 재할당할 수 있다.
-> const는 값의 변경이 불가능하고, 상수를 선언하는데 사용된다.
함수 선언형과 함수 표현식의 차이
⭐️ 함수 선언형은 'function'키워드를 사용하여 함수를 정의하며, 함수의 이름을 지정할 수 있다. 함수 선언형은 함수의 정의가 스코프 맨위로 끌어올려지는 호이스팅 현상이 있으며, 함수가 정의되기 전에 호출할 수 있다.
⭐️ 함수 표현식은 함수를 변수에 할당하는 방식으로 정의한다. 함수의 이름을 생략하거나, 이름을 지정하여 함수를 정의할 수 있다. 함수의 이름을 생략할 경우 함수 이름은 변수 이름으로 사용되며, 외부에서는 호출할 수 없다.
이벤트 버블링과 캡처링
⭐️ 이벤트 버블링(Event Bubbling)은 하위 요소에서 이벤트가 발생하면 해당 요소에서 시작해 상위 요소로 전파된다. 예를 들면, 버튼이 클릭되면, 해당 버튼에서 시작하여 부모요소, 그리고 최상위 요소까지 이벤트가 전파된다.
⭐️ 이벤트 캡처링(Event Capturing)은 최상위 요소에서 이벤트가 발생하여 하위 요소로 전파된다.
이벤트 전파는 이벤트 리스너에 의해 처리되는데 addEventListener 메서드의 세번째 인수로 이벤트 전파 방식을 나타내는 값(true / false)을 받는데 이 값이 true면 캡처링, false면 버블링이 적용된다.
클로저(Closure)
클로저란 함수가 자신이 생성될 때의 환경(Lexical Environment)을 기억하여, 함수가 종료된 이후에도 그 환경에 접근할 수 있는 기능을 말한다.
클로저는 함수 내부에 정의된 함수나 변수를 외부에서 참조할 때 생성된다. 함수 내부에 정의된 함수나 변수는 외부에서 직접 접근할 수 없으며, 해당 함수를 호출해야만 접근할 수 있다.
클로저는 외부 함수 내부에 정의된 함수나 변수를 안전하게 보관하고 사용할 수 있게 한다.
호이스팅(hoisting)
호이스팅은 자바스크립트에서 변수와 함수 선언이 해당 스코프의 최상단으로 끌어올려지는것을 말한다.
변수 선언의 경우, 변수 선언 키워드가 해당 스코프 내 가장 상단으로 끌어올려지고 변수 할당은 그 이후에 실행된다.
함수 선언의 경우, 함수 이름과 코드가 전체 스코프 내 가장 상단으로 끌어올려지고, 함수 표현식은 호이스팅되지 않는다.
호이스팅은 코드 가독성을 해치기 때문에, 스코프 최상단에서 한 번에 선언하는게 좋다.
데이터 타입
데이터 형 변환
데이터 형 변환은 자동 형 변환과 명시적 형 변환이 있다.
자동 형 변환(Implicit Type Conversion)
두 개의 데이터 타입이 서로 다를 경우, 자동으로 타입이 변환된다.ex) 숫자 + 문자 => 문자열
명시적 형 변환(Explicit Type Conversion)
개발자가 의도적으로 형 변환이 가능하다.
⭐️ Number() 함수: 문자열을 숫자로 변환
⭐️ String() 함수: 숫자를 문자열로 변환
⭐️ Boolean(): 값을 불리언 타입으로 변환
⭐️ ParseInt(): 문자열을 정수로 변환
⭐️ ParseFloat(): 문자열을 실수로 변환
데이터 형 변환은 자주 일어나면 가독성이 떨어지므로, 명시적 형 변환을 사용하는게 좋다
프로토타입
자바스크립트의 모든 객체는 프로토타입(prototype)이라는 객체를 가지고 있다.
모든 객체는 그들의 프로토타입으로부터 프로퍼티와 메소드를 상속받는다.
상속되는 정보를 제공하는 객체를 프로토타입이라고 한다.
깊은 복사와 얕은 복사
⭐️ 깊은 복사는 객체를 복사할 때 객체 자체를 새로 생성하고, 그 안에 있는 모든 값을 복사하여 새로운 객체를 만드는 것을 말한다. 복사된 객체와 원본 객체는 완전히 독립적인 존재이다.
⭐️ 얕은 복사는 객체를 복사할 때, 객체 자체는 새로 생성하지만 참조 타입 데이터가 저장한 '메모리 주소 값'을 복사한 것이다. 객체 내부에 참조하는 값은 복사되지 않고 그대로 공유된다. 따라서, 하나의 객체가 변경되면 다른 객체도 영향을 받는다.
불변성을 유지하려면?
불변성을 유지하기 위해선 해당 객체를 변경할 수 없도록 만들어야 한다.