면접질문 정리해보기 1


  1. let, const, var 의 차이점 설명
  • var 는 함수스코프를 가지고 재선언과 재대입이 모두 가능합니다. 그리고 호이스팅이 일어납니다. let과 const는 블록 스코프를 가지고 호이스팅이 일어나지 않습니다. 둘 다 재선언이 불가능하고, let은 재대입이 가능하고 const는 재대입이 불가능합니다.
  1. 호이스팅이 무엇인가요 ?
  • 일반 함수의 선언부나 var로 선언된 변수의 선언부가 해당 스코프의 맨 위로 끌어 올려지는것입니다.
  1. null과 undefined의 차이점을 설명해주세요.
  • null은 값이 비어있는 것이고, undefined는 변수선언은 되었지만 값은 할당하지 않은 상태입니다. 자료형(string, number같은 타입)이 결정되지 않은 형태라고 할 수 있습니다.
  1. 참조 타입과 원시 타입에 대해서 말해보세요.
  • 원시타입에는 boolean, null, undefined, number, string, symbol 이 있고 참조타입에는 객체가 있습니다. 원시타입은 값 자체로 비교되고 불변의 성질이 있게때문에 값 자체를 변경할 수 없습니다. 하지만 만약 let이나 var로 선언한 변수라면 재대입은 가능합니다. 참조타입은 참조로 비교되고 그렇기 때문에 참조를 바꾸어 값을 변경할 수 있습니다.
  1. 참조라는것이 무엇인가요?
  • 참조는 데이터가 저장된 장소를 가리키는 값입니다.
  1. =====의 차이점을 말해주세요.
  • ==은 두 값의 타입을 맞추어서 비교하고 ===은 두 값의 타입까지 확인하여 비교합니다. 숫자 0과 문자열 ‘0’을 비교할 떄 ==은 true가 나오고 ===은 false 가 나옵니다.
  1. 래퍼 객체란 무엇인가요
  • 원시타입 string, number, boolean, symbol의 속성이나 메소드를 호출하려고 할 때 객체인것 처럼 동작하게 해 점표기법을 사용할 수 있게 해줍니다.
  • string이나 number같은 원시타입을 사용할 때에는 래퍼객체로 감싸진 상태로 사용되는데 이 때 객체의 프로퍼트들을 사용할 수 있습니다.
  1. 렉시컬 스코핑이 무엇인가요 ?
  • 중첩된 스코프에서 안쪽에 있는 함수는 바깥쪽에 있는 함수의 변수를 가져다 쓸 수 있는데 이것을 렉시컬 스코핑이라고 합니다.
  1. 전역 변수를 지양하는 이유 ?
  • 전역변수는 어디에서든지 가져다 쓸 수 있어서 좋은 장점도 있지만 반면에 큰 프로젝트에서 소스를 나눠서 관리 할 때에는 충돌이 일어날 수 도 있습니다. 또 전역 변수는 사용자가 쉽게 확인할 수 있기 때문에 해킹이나 보안적 측면에서도 좋지 않습니다. 또 전역객체에 들어있는 전역변수는 가비지 콜렉터가 수집하지 않으므로 사용하지 않을때도 계속 메모리상에 남아있어서 메모리 누수가 있을 수 있습니다.
  1. this에 대해 설명해주세요.
  • this는 일반적으로 생성자 함수나 메소드에서 사용을 해서 그 생성자 함수가 만들어 낸 인스턴스 객체를 가리키는 용도로 사용이 됩니다. 하지만 생성자 함수나 메소드가 아니더라도 this를 선언한다고 해서 에러가 나는 것은 아닙니다. 그래서 this는 어디서 어떻게 정의되는지, 어떻게 호출되는지에 따라서 this가 가리키는 값이 달라집니다. 생성자 함수에서 사용됐다면 생성자 함수가 만들어 낸 인스턴스 객체를 가리키고, 메소드에서 사용됐다면 메소드를 호출 한 주체를 가리키게 되고, 화살표 함수에서 사용됐다면 해당 화살표 함수가 정의 된 스코프 안에 존재하는 this의 값을 이어받습니다. this가 없으면 그 상위 스코프에서 this를 내려받습니다. 전역 스코프에서 this가 정의되면 웹브라우저 상에서는 window 객체라는 전역 객체를 가리키게 됩니다. 일반 함수에서 this를 정의 했는데 그 함수가 일반함수로 호출 되면 윈도우 객체를 가리키게 됩니다.

  • 실행 컨텍스트를 가리킵니다. 때문에 상황에 따라 this가 가리키는게 다른데, 일반 함수와 전역 공간에서는 전역객체 window를 가리키고, 화살표 함수에서는 현재 실행 컨텍스트, 메소드 호출시에는 메소드 호출 주체, 생성자 함수에서는 인스턴스를 가리킵니다.

  1. 일반함수에서 this가 전역 객체 window를 가리키지 않게 하고싶으면 어떻게 해야하나요?
  • 전역객체를 가리키는것을 방지하고자 할때는 함수 내부 최상단에서 엄격모드를 켜주면 this는 윈도우 객체 대신 undefined를 가리키게 됩니다. 에러가 날지언정 윈도우 객체를 가리키는 일은 없으니 더 큰 에러를 예방할 수 있습니다.
  1. 화살표 함수에서의 엄격모드는 this를 어떻게 처리하는가?
  • 화살표 함수는 자기 자신의 this를 갖고있지 않으니까 아무런 영향을 받지 않는다. this가 전역 객체를 가리킬 수 있는 위험성이 있는 코드에서는 화살표 함수를 사용하지않는게 좋습니다.
  1. this를 원하는 것으로 바꾸고 싶을 때엔??
  • bind, apply, call 이라는 함수를 이용해서 바꿔치기 할 수 있는데 call, apply는 바로 호출하고 bind 는 바로 호출하지 않습니다. 그래서 bind 를 사용했을때에는 호출을 따로 해주어야합니다. call은 파라미터를 넘길 때 콤마로 구문해서 넣어주고 apply는 파라미터를 배열로 넘겨주는 차이점이 있습니다.
  1. 화살표 함수와 생성자 함수에서의 this는 정의되는 방법이 다른데 그것을 코드로 작성해서 설명해주세요.
  1. 화살표 함수의 장점
  • 화살표 함수는 this가 고정되어있기 때문에 함수의 인자로 넘겨주는 함수를 작성할 때 잘 사용합니다. 또 간단하게 작성할 수 있어서 편리합니다.
  1. 일반함수와 화살표 함수의 차이점
  • 일반 함수는 this를 바꿔줘야하지만 화살표함수는 실행컨텍스트로 설정되어있기 때문에 따로 바꿔주지않아도 됩니다. 그렇기 때문에 bind, call, apply와 같은 함수들이 먹히지 않습니다.

  • 일반 함수는 생성자로 사용될 수 있지만, 화살표 함수는 생성자로 사용할 수 없습니다 그래서 프로토타입 속성도 갖고있지 않습니다.

  • 화살표는 스스로의 this, argument, super를 가지지 않습니다.

  1. arguments란 무엇인가요 ?
  • function 구문으로 만들어진 함수의 매개변수에 들어오는 값을 순서대로 담은 유사배열 객체입니다. arguments 는 유사배열이기 때문에 인덱스를 이용해서 접근할 수 있지만 배열의 메소드들은 사용할 수 없습니다. 지금은 ES6에서 추가된 나머지 매개변수라는 문법을 많이 사용하는데, 이 나머지 매개변수는 실제 배열이기 때문에 배열의 메소드들도 사용할 수 있습니다.
  1. 화살표함수에는 arguments 가 없는건가요?
  • 화살표함수는 this, super, arguments 를 가지지않습니다.
  1. window 객체가 무엇인가요?
  • 자바스크립트의 구동환경에는 꼭 하나의 전역객체가 존재하는데 웹 브라우저에서 구동했을때의 전역 객체
  • 인터넷 브라우저에서의 전역객체가 window 객체이다.
  1. 전역 변수가 무엇인가요?
  • 전역에서 선언 된 변수가 전역변수이고 전역 객체 안에 저장됩니다.
  1. 전역 변수를 사용하면 안되는 이유가 무엇인가요 ?
  • 메모리 누수 자바스크립트에는 가비지컬렉터라는 사용하지 않는 메모리를 수집해가는 콜렉터가 있는데 이 콜렉터는 루트 객체)웹브라우저에슨 ㄴ윈도우 객체 )속에 있는 속성들은 모두 사용되는 것이라고 생각해서 그 안에 저장되어있는 객체의 속성은 건드리지 않습니다 .그래서 실제로는 ㄱ사용되지 않는 변수지만 가비지 콜렉터가 수집하지 않을 수 있어 메모리 낭비가 발생할 수 있습니다.
  1. 전역 변수를 사용하려면 어떻게 해야하나요?
  • 클로저나 모듈화를 이용해 사용할 수 있습니다.
  1. Let, var, const의 차이?
  2. 호이스팅이란 ?
  3. 원시 타입 6가지 ?
  4. 자바스크립트에서의 this를 설명하세요.
  5. this를 바꾸기 위해 어떻게 해야될까요?
  6. arquments가 무엇인지?
  7. 일반함수와 화살표함수의 차이점은?
  8. 화살표 함수의 장점?
  9. 화살표 함수를 사용하면 안되는 곳?
  • 생성자 함수로 사용할 수 없고, 내려받는 this가 전역 객체를 가리키는 코드에서는 사용하면 안됩니다. 그리고 익스플로러에서 사용할 수 없습니다.