Promise는 어느 시점에 resolve된 값 또는 resolve되지 않은 이유(예: 네트워크 오류가 발생) 중 하나의 값을 생성할 수 있는 객체
promise는 fulfilled, rejected, pending 3가지 상태 중 하나일 수 있습니다.
promise 사용자는 콜백을 붙여서 fulfill된 값이나 reject된 이유를 처리할 수 있습니다.
Promise
는 then()
메서드를 사용하여 연속적인 비동기 코드를 작성성할 수 있습니다. 이렇게 하면 콜백 체인이 아닌 평평한 구조로 코드를 작성할 수 있으며, 콜백 지옥에서 벗어날 수 있습니다.Promise.all()
을 사용하여 병렬 비동기 코드를 쉽게 작성할 수 있습니다.Promise
를 지원하지 않는 경우가 있습니다. 이를 사용하기 위해서는 polyfill
을 로드해야 합니다.JavaScript
의 오랜 문제점들을 해결하고 JavaScript
안티 패턴을 방지합니다.JavaScript
위에 syntactic sugar를 제공함으로써 더 짧은 소스코드를 작성할 수 있도록 해줍니다.JavaScript
만 실행하기 때문에 빌드/컴파일 프로세스가 필요하며 브라우저에 제공되기 전에 JavaScript
로 코드를 컴파일해야 합니다.for (var property in obj) {
console.log(property);
}
그러나, 이는 상속된 속성도 반복되며, 사용하기 전에 obj.hasOwnProperty(property)
체크를 추가해야 합니다.
Object.keys(obj).forEach(function (property) { ... })
Object.keys()
는 전달하는 객체의 열거 가능한 모든 속성을 나열하는 정적 메서드입니다.
Object.getOwnPropertyNames(obj).forEach(function (property) { ... })
Object.getOwnPropertyNames()
는 전달하는 객체의 열거 가능한 속성과 열거불가능한 모든 속성을 나열하는 정적 메서드입니다.
for (var i = 0; i < arr.length; i++)
여기에 있는 일반적인 함정은 var
이 함수 스코프고 블록 스코프가 아니며, 대부분 블록 스코프의 반복자 변수를 원할 것이라는 점입니다. ES2015에는 블록 범위가 있는 let
이 추가됐고, 이를 대신 사용할 것을 권장합니다.
그래서 다음과 같이 됩니다.
for (let i = 0; i < arr.length; i++)
arr.forEach(function (el, index) { ... })
필요한 것이 배열의 요소라면 index
를 사용할 필요가 없기 때문에 이 구문이 더 편리 할 수 있습니다. 또한 every
과 some
메서드를 이용하여 반복을 일찍 끝낼 수 있습니다.
for (let elem of arr) { ... }
ES6는 String, Array, Map, Set
등과 같은 iterable protocol을 준수하는 객체를 반복 할 수 있게 해주는 새로운 for-of
루프를 도입했습니다. for
루프의 장점은 루프에서 벗어날 수 있다는 것이고, forEach()
의 장점은 카운터 변수가 필요 없기 때문에 for
루프보다 간결하다는 것입니다. for-of
루프를 사용하면, 루프에서 빠져 나올 수도 있고 더 간결한 구문도 얻을 수 있습니다.
또한, for-of
루프를 사용할 때 각 배열 요소의 인덱스와 값에 모두 접근해야하는 경우 ES6 Array
의 entries()
메소드와 destructuring
을 사용하면됩니다.
const arr = ['a', 'b', 'c'];
for (let [index, elem] of arr.entries()) {
console.log(index, ': ', elem);
}
Mutable
객체는 값이 변경 가능한 객체Immutable
객체는 값이 변경되지 않는 객체동기 함수는 호출되면 함수의 작업이 모두 완료될 때까지 코드 실행이 멈추고, 함수가 반환된 이후에 다음 코드가 실행되는 함수입니다. 즉, 함수 호출 이후에는 해당 함수가 반환될 때까지 코드 실행이 중지되며, 이후 코드는 순차적으로 실행됩니다. 이러한 방식으로 코드를 작성하면 코드의 순서가 보장되기 때문에 프로그래밍이 간단해지지만, 함수 실행 중에 다른 작업을 수행할 수 없기 때문에 시간이 오래 걸리는 작업을 수행하면 다른 코드가 실행되지 않는 문제가 발생할 수 있습니다.
비동기 함수는 함수가 호출되면 함수의 작업이 백그라운드에서 실행되며, 함수가 반환된 이후에도 코드 실행이 계속됩니다. 이러한 방식으로 코드를 작성하면 코드의 순서가 보장되지 않지만, 시간이 오래 걸리는 작업을 수행하는 동안 다른 코드가 실행될 수 있기 때문에 프로그램의 성능을 향상시킬 수 있습니다. 비동기 함수는 보통 콜백(callback) 함수나 프로미스(promise), async/await 등의 기술을 사용하여 구현됩니다.
이벤트 루프는 콜 스택을 모니터하고 태스크 큐에서 수행할 작업이 있는지 확인하는 단일 스레드 루프입니다. 콜 스택이 비어 있고 태스크 큐에 콜백 함수가 있는 경우, 함수는 큐에서 제거되고 실행될 콜 스택으로 푸시됩니다.
콜 스택은 현재 실행 중인 함수의 정보를 담는 자료구조이며, 태스크 큐는 비동기 작업이 완료되면 대기열에 추가하는 자료구조
Callback 대신에 Promise를 사용할 때의 장점과 단점은 무엇인가요?
콜 스택과 태스크 큐의 차이점은 무엇인가요?
동기, 비동기 함수의 차이점을 설명하세요
JavaScript 코드를 작성하는 경우의 장단점은 무엇인가요?