Js 연습 면접 질문

안녕하십니까,
제 이름은 Viktor이고 우크라이나 출신이며 Node.js 백엔드 엔지니어입니다.
오늘은 dev.to에 첫 글을 쓰게 되니 너무 욕하지 말아주세요.

우리 회사에서는 때때로 후보자 인터뷰에 참여하는데 주로 Node.js, AWS, 서버리스 스택에 관한 것입니다.

때때로 후보자의 기술을 평가하기 위해 코드의 출력에 대해 물어볼 수 있습니다. 내 경험상 이론을 잘 아는 지원자들이 엄청나게 많은데 일단 코드를 보여주면 90%는 정답을 내놓을 수 없다. 그래서 이론을 묻지 않고 코드를 보여주며 몇 가지 부분/영역을 평가하기로 했다.

이번 포스트에서는 지원자들에게 물어보는 5가지 예를 제시할 것입니다.

1. 화살표 기능

const obj = {
  name: "Viktor",
  getName: () => this.name
} 

console.log(obj.getName()) // result ? 



Wrong Answer: "Viktor"
Right Answer: undefined


설명
화살표 함수는 자신의 this를 바인딩하지 않고, 대신 this에 액세스하면 외부에서 가져오고 "lexical scoping"이라고 하는 상위 범위에서 상속합니다. this를 전역 컨텍스트에서 사용하면 브라우저의 창 개체와 노드의 전역 개체를 참조합니다.

이 문제를 해결할 수 있는 한 가지 가능한 솔루션으로 일반 함수를 사용하십시오.

const obj = {
  name: "Viktor",
  getName: function () {
   return this.name
  }
} 


2. Const 선언

const score = 10;
if (score < 100) {
    const result = "Not Passed";
}
console.log('result', result);



Wrong answer: "Not Passed”, undefined, null
Right Answer: ReferenceError: result is not defined


설명
상수는 블록 범위입니다.
그렇다면 블록이란 무엇입니까? 블록(즉, 코드 블록)은 중괄호({...}) 쌍을 사용하여 정의하는 코드 섹션입니다. 이 같은:

//outer block scope
{//inner block-scope
  const name = "Viktor";
}
//outer block scope


const로 선언된 모든 변수는 블록 수준 범위를 가지며 선언된 문장이나 표현식으로 범위를 제한합니다. 따라서 우리의 경우 외부 범위는 내부 범위에서 정의된 값을 읽을 수 없습니다(var로 정의된 경우 제외).

3. setImmediate() 대 setTimeout()

// timeout_vs_immediate.js
setTimeout(() => {
  console.log('timeout');
}, 0);

setImmediate(() => {
  console.log('immediate');
});



$ node timeout_vs_immediate.js


어떤 결과가 출력될까요?

Wrong answer:
timeout
immediate

AND

immediate
timeout

Right Answer: The output of the above is not predictable

설명:
타이머가 실행되는 순서는 타이머가 호출되는 컨텍스트에 따라 달라집니다. 둘 다 기본 모듈 내에서 호출되는 경우(I/O 주기 내에 있지 않은 경우) 두 타이머가 실행되는 순서는 프로세스의 성능에 의해 제한되므로 비결정적입니다.

그러나 I/O 주기 내에서 두 호출을 이동하면 즉시 콜백이 항상 먼저 실행됩니다.

// timeout_vs_immediate.js
const fs = require('fs');

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('timeout');
  }, 0);
  setImmediate(() => {
    console.log('immediate');
  });
});



$ node timeout_vs_immediate.js
immediate
timeout


4. 루프 내부의 클로저

for(var i = 0; i < 10; i++) {
    setTimeout(function() {
      console.log(i);  
    }, 10);
}


무엇이 기록됩니까?

Wrong answer: 0,1,2,3,4,5,6,7,8,9
Right answer: 10,10,10,10,10,10,10,10,10,10 //ten 10 times


설명:
콘솔 로그는 비동기 setTimeout 함수 안에 있으며 setTimeout은 현재 스택이 끝나면 실행됩니다. 따라서 루프가 종료되고 setTimeout이 실행됩니다. 루프가 이미 완료되었으므로 값 i는 10으로 설정되었습니다. setTimeout이 i 값을 참조로 사용하면 i 값이 10이 되므로 이를 기준으로 10이 10번 기록됩니다.

5. ..toString()

2022..toString() // result ?



Wrong answer: SyntaxError: Invalid or unexpected token
Right answer: "2022"


설명:
첫 번째 점은 실제로 소수점이고 두 번째 점은 속성 또는 메서드를 호출하므로 2022..toString()은 2022.0.toString()의 짧은 버전입니다.


나는 그것이 당신에게 흥미로웠고 당신이 새로운 것을 배웠기를 바랍니다.

건배,
빅토르

좋은 웹페이지 즐겨찾기