💥이모티콘이 있는 질문은 면접에서 받았던 질문입니다.
프로그래밍
프로그래밍이란 뭐라고 생각하나요?💥
컴파일러는 뭐고 인터프리터는 뭔가요?
변수
호이스팅이 뭔가요?💥
let 키워드는 var 키워드와 어떤 점이 다른가요?💥
2. let은 재할당만 가능하지만 var는 재선언, 재할당이 모두 가능합니다.
3. var는 선언과 동시에 undefined로 초기화가 되지만 let은 선언과 초기화가 분리되어 초기화가 되기전에 변수를 호출하면 ReferenceError가 발생합니다.
4. let은 변수 호이스팅이 일어나지 않는 것 처럼 동작합니다.
5. let은 전역 객체로 접근할 수 없습니다.
[추가 TDZ]
"let" 및 "const" 키워드로 선언된 변수는 TDZ(Temporary Dead Zone)에 영향을 받습니다. TDZ는 변수가 선언되었지만 초기화되기 전까지 액세스할 수 없는 구간을 의미합니다. 따라서 선언 이전에 "let" 또는 "const" 변수를 사용하면 ReferenceError가 발생합니다. 이와는 달리 "var" 키워드로 선언된 변수나 함수 선언은 TDZ에 영향을 받지 않으므로, 선언 이전에도 참조할 수 있습니다.
const 키워드는 어떤 특징이 있나요?💥
const 키워드로 선언한 변수는 선언과 동시에 초기화가 이루어져야 합니다.
2. 재할당 금지
var 또는 let 키워드로 선언한 변수는 재할당이 자유로우나 const 키워드로 선언한 변수는 재할당이 안됩니다.
3. 상수(변하지 않는 변수)
const로 선언한 변수에 원시 값을 할당한 경우 변수 값을 변경할 수 없습니다.
원시 값은 변경 불가능한 값이기 때문입니다. 이러한 특징을 사용하여 상수로 표현합니다.
식별자 네이밍 규칙은 어떤 것들이 있나요?
단 식별자는 특수문자를 제외한 문자, 언더스코어(_), 달러 기호로 시작해야 하며, 숫자로 시작하는 것은 허용하지 않습니다.
데이터 타입의 종류는 어떤 것들이 있나요?💥
데이터 타입은 왜 필요할까요?
2. 값을 참조할 때 읽어들여야 하는 메모리 공간의 크기를 결정하기 위해 필요합니다.
3. 메모리에서 읽어들인 2진수를 어떻게 해석해야 할지 결정하기 위해 필요합니다.
보충 설명
a라는 이름으로 공간을 만들었습니다. a공간에 2진수 형태로 데이터를 저장합니다. 이 과정에서 우리가 직접 얼마의 메모리 공간을 확보해야하는지 명시해주지 않아도 됩니다. 자바스크립트 엔진은 데이터 타입에 따라 알맞은 크기의 메모리 공간을 확보해주기 때문입니다.
2.값을 참조할때 읽어들여야 하는 메모리 공간의 크기를 결정하기 위해 필요합니다.
a변수를 통해 50이라는 값이 저장되어 있는 메모리 공간을 찾아갈 수 있습니다. 이때 값을 참조하기 위해서는 한번에 읽어들여할 메모리 크기를 알아야 합니다. a변수의 경우, 저장되어 있는 값이 숫자타입이므로 8바이트 단위로 읽지 않으면 원하는 값을 얻어낼 수 없습니다. 그렇다면 컴퓨터는 어떻게 한 번에 읽어들일 메모리의 크기를 알아낼 수 있을까요? 자바스크립트 엔진은 a 변수에 숫자타입의 값이 할당되어있기 때문에 a변수를 숫자타입으로 인식합니다. 숫자 타입은 8바이트 단위로 저장되므로 a변수를 참조하면 8바이트 단위로 메모리를 읽어들여 값을 얻어낼수 있습니다. 이처럼 어떤 데이터를 참조하는 과정에서 얼마의 메모리 공간을 읽어 들일지 알기 위해 데이터타입이 필요합니다.
3.메모리에서 읽어들인 2진수를 어떻게 해석해야 할지 결정하기 위해 필요합니다.
a변수 값을 사용할려고 가져왔더니 2진수 형태로 저장되어 있습니다. 이는 숫자일수도 있고 문자일수도 있습니다. 이때 2진수를 어떻게 해석할지 결정하는 방법으로 데이터 타입이 쓰입니다.
명시적 타입 변환 함수를 예를 들어볼 수 있나요?
truthy / falsy 한 값이 뭔가요?💥
배열
배열의 메서드는 어떤 종류가 있나요?
고차 함수에 대해서 아나요?
forEach 메서드와 map메서드의 차이점은?💥
구조 분해 할당
구조 분해 할당이 뭔가요?
구조 분해 할당은 크게 어떤 종류가 있나요?
배열 구조분해 할당은 배열의 인덱스에 접근하지 않고도 변수에 값들을 분해하여 할당 할 수 있습니다. 배열안에 있는 변수의 인덱스와 일치하게 배열의 값들이 할당됩니다.
객체구조분해할당은 객체의 key와 이름이 동일한 변수에 key의 값을 할당합니다. props나 extends한 값들을 받아 사용할 때 객체구조분해하여 개별 변수로 사용합니다.
브라우저 렌더링 과정
브라우저의 렌더링 과정에 대해 설명해보세요💥
1. HTML 파일을 받은 브라우저는 파싱하며 DOM트리를 생성합니다.
2. HTML을 읽는 중 CSS 요청이 발생하면 CSS 파일을 받아와 CSSOM 트리를 생성합니다.
3. JavaScript 코드를 만나면 HTML 파싱을 중단하고 제어권한을 JavaScript 엔진에게 넘깁니다. JavaScript 코드를 파싱하고 실행합니다.
4. DOM 트리와 CSSOM 트리를 결합하여 렌더 트리(Render Tree)를 생성합니다. 렌더 트리는 화면에 실제로 표시될 요소들로 구성됩니다.
5. 렌더 트리의 각 노드에 대해 위치와 크기를 계산하는 레이아웃(Layout) 단계가 발생합니다.
6. 레이아웃 단계에서 계산된 위치와 크기를 실제 픽셀로 변환하여 화면에 출력합니다. 이를 페인트(Paint)라고 합니다.
7. Composition 단계에서는 레이아웃과 페인트를 수행하지 않고 레이어의 합성만 실행합니다. 이 단계에서는 transform, opacity와 같은 요소들이 처리됩니다.이러한 과정을 통해 HTML, CSS, JavaScript를 조합하여 브라우저에서 웹 페이지를 렌더링하고 화면에 표시됩니다.
***리플로우와 리페인트가 무엇인가요?
HTML의 레이아웃이 변경될 경우 레이아웃 단계에서 렌더트리가 재생성되어 리플로우가 실행됩니다. 레이아웃과 관련없는 스타일이 변경될 경우에는 체인트 단계가 다시 실행되어 리페인트가 실행됩니다.
브라우저의 렌더링 과정에 자바스크립트는 어떻게 동작하나요?💥
2. 자바스크립트 엔진은 자바스크립트 코드를 파싱하고 실행합니다. 이때, 자바스크립트 코드에는 동기적으로 실행되는 코드와 비동기적으로 실행되는 코드가 있을 수 있습니다.
3.동기적으로 실행되는 코드는 자바스크립트엔진이 차례대로 실행하며 결과가 바로 반영됩니다.
4.비동기적으로 실행되는 코드는 자바스크립트 엔진에 의해 백그라운드에서 실행됩니다. 이는 보통 네트워크 요청, 파일 로딩, 타이머 등이 해당됩니다.
5. 비동기적으로 실행되는 코드가 완료되면, 이벤트 큐에 해당 작업에 대한 콜백이 등록됩니다.
6. 이벤트 큐에서 대기하고 있는 콜백은 렌더링 엔진이 다른 작업이 없을 때 실행됩니다.
7. 콜백이 실행되면 자바스크립트 엔진은 필요한 경우 돔을 변경하거나 스타일을 수정하는 등의 작업을 수행합니다.
8. 이러한 변경 사항은 다음 렌더링 주기에서 반영되어 화면에 업데이트 됩니다.
<script></script> 태그를 태그 밑에 둬야하는 이유가 있을까요?
DOM
DOM이 뭔가요?
DOM을 구성하는 건 뭐가 있나요?
이벤트
이벤트 핸들러를 등록하는 방식에는 어떤 것들이 있나요?
element.addEventListener('event', handler) 로 이벤트를 등록하는 addEventListener 메서드 방식이 있습니다.
이벤트 전파(propagation)에 대해서 알고 있나요?💥
이벤트 위임(delegation)에 대해서 알고있나요?💥
보충 설명
이벤트위임을 사용하기 전
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
<script>
const li = document.querySelectorAll("li");
li.forEach((li) => {
li.addEventListener("click", () => {
li.classList.add("selected");
});
});
</script>요소에 개별적으로 이벤트 리스너를 등록하고 있습니다. 이는 동일한 동작을 수행하는 요소에게 이벤트 리스너를 여러 번 중복해서 등록하는 것입니다. 여러개의 이벤트 리스너를 등록하는 경우, 각 요소에 대해 별도의 리스너를 등록하므로 메모리 사용량이 증가하고 많은 요소에 대한 이벤트 처리가 필요할 때 성능 저하가 일어날 수 있습니다. 또한 요소가 동적으로 추가 또는 제거되는 경우, 각각의 이벤트 리스너를 새로 등록하거나 제거해야하는 번거로움이 발생 할 수 있습니다.
이벤트 위임을 사용한 예
const ul = document.querySelector("ul");
ul.addEventListener("click", (event) => {
if (event.target.tagName == "LI") {
event.target.classList.add("selected");
}
});이벤트 위임을 사용한 예시는 상위 요소에 하나의 이벤트 리스너를 등록하여 모든 자식 요소의 이벤트를 처리합니다. 이벤트 위임을 사용하면 동적으로 생성되는 요소에 대해서도 이벤트 처리를 보장할 수 있으며, 이벤트 리스너의 중복 등록 문제를 피할 수 있습니다.
e.preventDefault에 대해 알고 있나요?
e.stopPropagation에 대해 알고 있나요?
객체 리터럴
함수와 메서드의 차이점에 대해 알고 계신가요?
자바스크립트에서 객체를 생성하는 방법은 어떤 것들이 있나요?
- 객체 리터럴 `const obj = {}`
- 생성자 함수
- 클래스(ES6)
- Object.create() 메서드
보충 설명
const person = {
name: "John",
age: 30,
occupation: "Developer"
};- 생성자 함수 예시
//1번
function Person(name, age, occupation) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
const person = new Person("John", 30, "Developer");
//2번
var day = new Date(); // new 연산자를 사용하여 Date 타입의 객체를 생성함.
document.write("올해는 " + day.getFullYear() + "년입니다.");- 클래스 예시
class Person {
constructor(name, age, occupation) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
}
const person = new Person("John", 30, "Developer");- Object.create() 메서드 예시
const personPrototype = {
sayHello: function() {
console.log("Hello!");
}
};
const person = Object.create(personPrototype);
person.name = "John";
person.age = 30;
person.occupation = "Developer";원시 값과 객체 비교
동적 타이핑을 지원하는 자바스크립트에서 데이터의 타입을 크게 2개로 나누는 이유가 있을까요?
값에 의한 전달이 뭔가요?💥
참조에 의한 전달이 뭔가요?💥
함수
자바스크립트에서 함수를 정의하는 방법은 몇가지가 있나요?
함수 선언문과 함수 표현식은 어떤 차이가 있나요?
함수 표현식은 함수 선언을 값처럼 사용하는 방식입니다. 함수 선언문과 달리 함수 표현식은 선언 이전에 접근이 불가하고 할당된 변수에 따라 스코프가 결정됩니다.
즉시 실행 함수(IIFE)에 대해 알고 있나요? 알고 있다면 아는 내용에 대해 말해보세요
즉시 실행함수를 사용하면 1. 필요없는 전역 변수의 생성을 줄일 수 있고, 2. private한 변수를 만들 수 있습니다. 그래서 단 한번의 사용이 필요한 함수, 변수를 초기화 하는 함수의 경우에 사용하면 좋고, 자바스크립트의 모듈을 만들 때 사용하면 좋다고 알고있습니다.
- 또한, 트러블 슈팅을 할 때 유용하게 사용할 수 있습니다. 콘솔로그를 즉시실행함수로 만들고 프로그램을 실행시킨 후 로그의 유무에 따라 실행 후 에러가 발생하는지, 에러가 실행 이후에 발생하는지 확인할 수 있습니다.
스코프
스코프가 뭔가요?💥
스코프에는 어떤 종류가 있죠?💥
렉시컬 스코프를 아나요? 안다면 렉시컬 스코프는 무엇을 의미하나요?💥
전역 변수로 변수를 선언하면 생기는 문제점은 무엇이 있을까요?💥
2. 메모리 낭비 : 전역변수는 프로그램의 실행 동안 메모리를 계속 차지하므로, 불필요한 전역 변수의 사용은 메모리 낭비로 이어 질 수 있습니다.
생성자 함수
객체 리터럴로 만들 때와는 무슨 차이가 있죠? 왜 생성자 함수를 사용하나요?
생성자 함수가 객체(인스턴스)를 생성하는 과정에 대해 간략하게 설명해줄 수 있나요?
//1.생성자 함수 선언
function User(name) {
// this = { } 3. 빈 객체가 암시적으로 만들어짐
//4. 새로운 프로퍼티를 this에 추가함
[this.name](http://this.name/) = name;
this.isAdmin = false;
// return this; 5. this가 암시적으로 반환됨
}
let user = new User("쿠마") //2.인스턴스 생성함수와 일급 객체
일급 객체가 뭔가요?
자바스크립트에서 함수가 일급 객체라면, 일급 객체로 뭘 할 수 있나요?
2. 매개변수로 전달할 수 있습니다: 함수는 다른 함수의 매개변수로 전달될 수 있습니다. 이를 통해 함수를 콜백으로 사용하거나, 동적으로 함수를 생성하고 조작할 수 있습니다.
3. 반환값으로 사용할 수 있습니다: 함수는 다른 함수의 반환값으로 사용될 수 있습니다. 이를 통해 함수가 다른 함수에 필요한 동작을 정의하고 반환하거나, 함수를 조합하여 더 복잡한 동작을 구성할 수 있습니다.
이러한 특징을 통해 함수를 값처럼 다룰 수 있고, 함수를 조합하고 활용하여 유연하고 강력한 동작을 구현할 수 있습니다. 함수형 프로그래밍 패러다임에서는 이러한 특징을 기반으로 데이터와 동작을 분리하여 코드의 재사용성과 가독성을 높이는 등의 장점을 제공합니다.
함수형 프로그래밍이 뭔가요?
순수 함수가 뭔가요? 일반 함수와는 어떤 차이가 있죠?
객체지향 프로그래밍
객체지향 프로그래밍은 무엇을 의미하나요?
객체지향 프로그래밍의 특징에 대해 말해볼 수 있나요?
프로토타입이 뭔가요?
클래스 형식에서의 상속을 구현하기 위해 있는 속성이라고 알고있습니다.
strict mode
strict mode가 뭔가요?
strict mode를 통해 무엇을 예방할 수 있죠?
암묵적인 전역 변수 생성 방지, 변수 삭제 방지(strict mode에서는 delete 연산자를 사용하여 변수를 삭제할 때 오류가 발생합니다. 이는 실수로 중요한 변수를 삭제하는 것을 방지하여 예기치 않은 동작을 예방), 중복된 매개변수 이름 방지, 읽기 전용 객체 변경 방지 등의 사이드 이펙트를 방지할 수 있습니다.
빌트인 객체
빌트인 객체가 뭔가요?
Object, String, Number, Boolean, Symbol, Date, Math, RegExp, Array, Map/Set, WeakMap/WeakSet, Function, Promise, Reflect, Proxy, JSON, Error 등 40여개 표준 빌트인 객체가 있습니다.
빌트인 객체의 종류는 어떤게 있죠?
생성자 함수 객체는 표준 빌트인 객체 중 대부분이 생성자 함수로 정의되어 있습니다. 생성자 함수 객체는 객체를 생성하기 위한 함수로, new 연산자와 함께 사용하여 새로운 인스턴스를 생성할 수 있습니다. 생성자 함수 객체는 프로토타입 메서드와 정적 메서드를 제공합니다. 예를 들어, Array 생성자 함수는 배열 객체를 생성하는 데 사용되며, 배열과 관련된 다양한 프로토타입 메서드와 정적 메서드를 제공합니다.
그 외 객체에는 Math, Reflect, JSON 등 표준 빌트인 객체 중에서는 생성자 함수 객체가 아닌 다른 형태의 객체입니다. 이러한 객체들은 정적 메서드만을 제공하며, 인스턴스를 생성할 수는 없습니다. 예를 들어, Math 객체는 수학적인 연산을 수행하기 위한 다양한 정적 메서드를 제공합니다. Reflect 객체는 자바스크립트의 내장 동작을 실행하기 위한 메서드를 제공하며, JSON 객체는 JSON 데이터의 파싱과 직렬화를 위한 메서드를 제공합니다.
추가적으로 호스트 객체는 ECMAScript 사양에 정의되지 않았지만 자바스크립트 실행 환경에서 추가로 제공하는 객체이며, 사용자 정의 객체는 개발자가 직접 정의한 객체를 말합니다.
래퍼 객체에 대해서 알고 있나요?
원시 타입은 원래 객체가 아니지만, 일부 상황에서는 객체처럼 동작해야 하는 경우가 있습니다. 예를 들어, 원시 타입인 문자열에 대해 문자열의 길이를 구하거나 소문자로 변환하는 등의 작업을 수행하려면 객체처럼 메서드를 호출해야 합니다. 이 때 자바스크립트 엔진은 해당 원시값에 대해 자동으로 래퍼 객체를 생성하여 임시로 사용하게 됩니다.
예를 들어, 원시 문자열을 다음과 같이 사용할 수 있습니다:
var str = "Hello";
console.log(str.length); // 5
console.log(str.toUpperCase()); // "HELLO"위의 예제에서 문자열 str은 원시 타입이지만, 자바스크립트 엔진은 str.length와 str.toUpperCase()와 같은 속성 및 메서드에 접근하기 위해 임시로 래퍼 객체를 생성합니다. 이후 연산이 완료되면 래퍼 객체는 파괴되고, 다시 원시 타입으로 되돌립니다.
이러한 래퍼 객체는 자바스크립트 엔진 내부에서 처리되므로 직접적으로 래퍼 객체를 생성하거나 사용할 필요는 없습니다. 자바스크립트는 필요한 상황에서 자동으로 래퍼 객체를 생성하여 사용합니다.
this
this가 뭔가요?💥
this 바인딩이란?💥
this는 동적으로 바인딩이 된다고 하는데 바인딩되는 객체가 어떻게 다르나요?💥
실행 컨텍스트
실행 컨텍스트에 대해 말해보세요
클로저
클로저에 대해서 아나요?💥
클로저를 사용하면 뭐가 좋죠?💥
클로저를 어떻게 생성하나요?💥
클래스
그럼 생성자 함수와 클래스는 어떤 차이가 있나요?
클래스 정의
클래스 상속
스프레드 문법
spread 문법이 뭔가요?
어떤 상황에서 사용할 수 있죠?
타이머
타이머 함수에는 어떤 것들이 있나요?
이벤트가 과도하게 호출되어 성능에 문제를 일으킬 경우에 할 수 있는 어떤 일을 통해 해결할 수 있나요?
디바운스에 대해서 알고 있나요?
쓰로틀에 대해서 알고 있나요?
비동기 프로그래밍
동기와 비동기의 차이점에 대해서 설명해줄 수 있나요?
이벤트 루프와 태스크 큐에 대해서 알고 있나요?
마이크로태스크 큐에 대해서 알고 있나요?
태스크 큐와 마이크로태스크 큐 중 어떤 것이 먼저 실행되나요?
Ajax
JSON이 뭔가요?
JSON이 제공하는 정적 프로토타입 메서드에 대해 몇가지 말해볼 수 있나요?
XMLHttpRequest와 fetch 메서드의 차이는 무엇이라고 생각하시나요?
REST API
REST API가 뭔가요?
REST API의 구성은 어떤 것이 있나요?
REST API를 설계하는데 중요한 것이 있을까요?
HTTP 요청 메서드에 대해서 아는대로 얘기해보세요?
HTTP 상태 코드를 아는대로 말해주세요?
Promise
콜백이란 뭐라고 생각하나요?
프로미스가 뭔가요?
프로미스의 상태를 나타내는 것은 어떤 것들이 있나요?
프로미스 빌트인 객체가 제공하는 정적 메서드에 대해 알고 있나요?
제너레이터와 async await
제너레이터란 뭔가요? 일반 함수와는 어떤 차이가 있죠?
제너레이터의 구조
Promise와 async/await의 차이점
에러
에러처리를 왜 해야 하나요?
자바스크립트에서 에러를 처리하는 방법에는 뭐가 있을까요?
모듈