JavaScript 질문
프론트엔드 면접 질문 - JS 질문에 대한 해설입니다. Pull Request를 통한 제안, 수정 요청 환영합니다.
- 이벤트 위임에 대해 설명하세요.
this가 JavaScript에서 어떻게 작동하는지 설명하세요.- 프로토타입 상속이 어떻게 작동하는지 설명하세요.
- AMD vs CommonJS에 대해 어떻게 생각하나요?
- 다음이 IIFE로 작동하지 않는 이유를 설명하세요:
function foo(){ }();를 IIFE로 만들기 위해서는 무엇을 바꿔야하나요? null,undefined,undeclared의 차이점은 무엇인가요? 어떻게 이 상태들에 대한 확인을 할 것인가요?- 클로저는 무엇이며, 어떻게/왜 사용하나요?
.forEach루프와.map()루프 사이의 주요 차이점을 설명할 수 있나요? 왜 둘 중 하나를 선택할 것인가요?- 익명 함수의 일반적인 사용 사례는 무엇인가요?
- 코드를 어떻게 구성하나요? (모듈 패턴, 고전적인 상속?)
- 호스트 객체와 내장 객체의 차이점은 무엇인가요?
function Person(){},var person = Person(),var person = new Person()의 차이점은 무엇인가요?.call과.apply의 차이점은 무엇인가요?Function.prototype.bind에 대해 설명하세요.- 언제
document.write()를 사용하나요? - Feature detection, Feature inference, UA String의 차이점은 무엇인가요?
- Ajax에 대해 가능한 한 자세히 설명하세요.
- Ajax를 사용하는 것의 장단점은 무엇인가요?
- JSONP가 어떻게 동작하는지(그리고 Ajax와 어떻게 다른지)를 설명하세요.
- JavaScript 템플릿을 사용한 적이 있나요? 사용해봤다면, 어떤 라이브러리를 사용했나요?
호이스팅에 대해 설명하세요.- event bubbling에 대해 설명하세요.
- "attribute"와 "property"의 차이점은 무엇인가요?
- 내장 JavaScript 객체를 확장하는 것이 좋은 생각이 아닌 이유는 무엇인가요?
- document
load이벤트와 documentDOMContentLoaded이벤트의 차이점은 무엇인가요? ==와===의 차이점은 무엇인가요?- JavaScript와 관련하여 same-origin 정책을 설명하세요.
- 다음이 작동하게 만들어보세요.
- 왜 Ternary expression이라고 부르고, "Ternary"라는 단어는 무엇을 나타내나요?
"use strict";이 무엇인가요? 사용시 장단점이 무엇인가요?- 100까지 증가하면서
3의 배수에는fizz를 출력하고,5의 배수에는buzz를 출력하고,3과5의 배수에는fizzbuzz를 출력하는 for loop를 만드세요. - 일반적으로 웹 사이트의 전역 스코프를 그대로 두고 건드리지 않는 것이 좋은 이유는 무엇인가요?
- 왜
load이벤트와 같은 것을 사용하나요? 이 이벤트에는 단점이 있나요? 다른 대안을 알고 있나요? 알고 있다면 왜 그것을 사용할 건가요? - single page app이 무엇인지 설명하고 SEO-friendly하게 만드는 방법을 설명하세요.
- Promises와 그 Polyfill에 대한 당신의 경험은 어느 정도인가요?
- Callback 대신에 Promise를 사용할 때의 장점과 단점은 무엇인가요?
- JavaScript로 컴파일되는 언어로 JavaScript 코드를 작성하는 경우의 장단점은 무엇인가요?
- JavaScript 코드를 디버깅하기 위해 어떤 도구와 기술을 사용하나요?
- 오브젝트 속성이나 배열 항목을 반복할 때 사용하는 언어 구문은 무엇인가요?
- mutable 객체와 immutable 객체 사이의 차이점을 설명하세요.
- 동기, 비동기 함수의 차이점을 설명하세요.
- 이벤트 루프란 무엇인가요? 콜 스택과 태스크 큐의 차이점은 무엇인가요?
function foo() {}와var foo = function() {}사이에서foo사용의 차이에 대해 설명하세요.let,var,const를 사용하여 생성된 변수들의 차이점은 무엇인가요?- ES6 클래스와 ES5 함수 생성자의 차이점은 무엇인가요?
- 새 화살표 => 함수 문법에 대한 사용 예시를 들 수 있나요? 이 새로운 문법은 다른 함수와 어떻게 다른가요?
- 생성자의 메서드에 화살표 문법을 사용하면 어떤 이점이 있나요?
- 고차 함수(higher-order function)의 정의는 무엇인가요?
- 객체나 배열에 대한 디스트럭쳐링 예시를 들 수 있나요?
- ES6 템플릿 리터럴은 문자열을 생성하는데 많은 유연성을 제공합니다. 이에 대한 예를 들 수 있나요?
- curry 함수의 예를 들어 줄 수 있나요? 그리고 이 문법은 어떤 이점을 가지고 있나요?
- spread 문법을 사용할 때의 이점은 무엇이며 rest 문법과 다른 점은 무엇인가요?
- 파일 간에 코드를 공유하려면 어떻게 해야하나요?
- 정적 클래스 멤버를 만드는 이유는 무엇인가요?
- 다른 답변들
이벤트 위임에 대해 설명하세요.
이벤트 위임은 이벤트 리스너를 하위 요소에 추가하는 대신 상위 요소에 추가하는 기법입니다. 리스너는 DOM의 event bubbling으로 인해 하위 요소에서 이벤트가 발생될 때마다 실행됩니다. 이 기술의 이점은 다음과 같습니다.
- 각 하위 항목에 이벤트 핸들러를 연결하지 않고, 상위 요소에 하나의 단일 핸들러만 필요하기 때문에 메모리 사용 공간이 줄어듭니다.
- 제거된 요소에서 핸들러를 해제하고 새 요소에 대해 이벤트를 바인딩할 필요가 없습니다.
참고자료
- https://davidwalsh.name/event-delegate
- https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation
this가 JavaScript에서 어떻게 작동하는지 설명하세요.
this는 간단하게 설명하기 어렵습니다. JavaScript에서 가장 혼란스러운 개념 중 하나입니다. 대략 설명하면 this의 값은 함수가 호출되는 방식에 따라 달라집니다. 온라인에 많은 설명을 읽었는데, Arnav Aggrawal의 설명이 가장 명확했습니다. 다음 규칙과 같습니다.
- 함수를 호출할 때
new키워드를 사용하는 경우, 함수 내부에 있는this는 완전히 새로운 객체입니다. apply,call,bind가 함수의 호출/생성에 사용되는 경우, 함수 내의this는 인수로 전달된 객체입니다.obj.method()와 같이 함수를 메서드로 호출하는 경우,this는 함수가 프로퍼티인 객체입니다.- 함수가 자유함수로 호출되는 경우, 즉, 위의 조건 없이 호출되는 경우
this는 전역 객체입니다. 브라우저에서는window객체입니다. 엄격 모드('use strict') 일 경우,this는 전역 객체 대신undefined가 됩니다. - 위의 규칙 중 다수가 적용되면 더 상위 규칙이 승리하고
this값을 설정합니다. - 함수가 ES2015 화살표 함수인 경우 위의 모든 규칙을 무시하고 생성된 시점에서 주변 스코프의
this값을 받습니다.
상세한 설명은 Medium의 글을 참조하세요.
References
- https://codeburst.io/the-simple-rules-to-this-in-javascript-35d97f31bde3
- https://stackoverflow.com/a/3127440/1751946
프로토타입 상속이 어떻게 작동하는지 설명하세요.
이는 매우 일반적인 JavaScript 인터뷰 질문입니다. 모든 JavaScript 객체는 다른 객체에 대한 참조인 __proto__ 프로퍼티를 가지고 있습니다. 객체의 프로퍼티에 접근할 때, 해당 객체에 해당 프로퍼티가 없으면 JavaScript 엔진은 객체의 __proto__과 __proto__의 __proto__등을 보고 프로퍼티 정의가 있을 때까지 찾고, 만약 객체의 프로퍼티에 접근할 때 해당 객체에 해당 프로퍼티가 없으면 프로토타입 체인 중 하나에 있거나 프로토타입 체인의 끝에 도달할 때까지 찾습니다. 이 동작은 고전적인 상속을 흉내내지만, 실제로 상속보다 위임에 더 가깝습니다.