[모던 자바스크립트 Deep Dive] 15~19장 퀴즈

jini.choi·2023년 11월 8일
0
post-thumbnail

📝 문제

15장 let, const 키워드와 블록 레벨 스코프

Q. 1️⃣,2️⃣번의 출력 결과와 이 코드의 부작용을 해결할 수 있는 방법을 찾은 후 그 후에 1️⃣,2️⃣ 출력 결과도 말씀하시오.

function foo() {
  var x = 1;

  if (true) {
    var x = 2; 
    console.log(x); // 1️⃣
  }

  console.log(x); // 2️⃣
}

foo();

16장 프로퍼티 어트리뷰트

Q. 아래 출력 결과를 말씀하시오.

const person = { age: 25 };
Object.preventExtensions(person);

console.log(Object.isExtensible(person)); // 1️⃣

person.name = 'Lee';

console.log(person); // 2️⃣

Object.seal(person);

console.log(Object.isSealed(person)); // 3️⃣

delete person.age;

console.log(person); // 4️⃣

person.age = 100;

console.log(person); // 5️⃣

17장 생성자 함수에 의한 객체 생성

Q.다음 설명 중 틀린 것을 모두 고르시오.

1️⃣. 생성자 함수는 객체를 생성하기 위한 템플릿(클래스)으로 동작하여, 인스턴스를 생성하고 초기화하는 역할을 한다.

2️⃣. 객체 리터럴에 의한 객체 생성 방식은 여러 개의 동일한 프로퍼티를 가진 객체를 효율적으로 생성할 수 있어 생성자 함수에 비해 유용하다.

3️⃣. 생성자 함수를 호출할 때, 내부에서 사용되는 this는 생성될 인스턴스를 가리키며, 이를 통해 인스턴스를 초기화할 수 있다.

4️⃣. 생성자 함수가 반환하는 값은 항상 생성된 인스턴스 자체이며, 다른 값을 반환하면 생성자 함수의 동작이 비정상적으로 이루어진다.

5️⃣. 생성자 함수의 이름은 관례적으로 소문자로 시작하여야 하며, 이를 통해 일반 함수와 구별된다.

18장 함수와 일급 객체

Q. 다음 설명 중 틀린 것을 고르시오.

1️⃣. 함수는 무명의 리터럴로 생성할 수 있으며, 런타임에 생성이 가능하다.

2️⃣. 함수는 변수나 자료 구조에 저장할 수 있으며, 객체에도 저장 가능하다.

3️⃣. 함수는 매개변수로 전달할 수 없으며, 오로지 반환값으로만 사용할 수 있다.

4️⃣. 함수 객체는 호출 가능하며, 함수 외에도 일반 객체와의 차이가 있다.

19장 프로토타입

Q. 다음 설명 중 틀린 것을 고르시오.

1️⃣. 모든 객체는 내부 슬롯 [[prototype]]을 가지며, 객체 생성 시 프로토타입은 객체 생성 방식에 따라 결정되고 [[prototype]]에 저장된다.

2️⃣. 프로토타입은 어떤 객체의 하위(자식) 객체가 상위(부모) 객체의 프로퍼티를 자유롭게 사용할 수 있도록 공유하는 역할을 한다.

3️⃣. 프로토타입을 통해 생성된 객체는 자신의 __proto__ 접근자 프로퍼티를 통해 프로토타입에 간접적으로 접근할 수 있다.

4️⃣. __proto__ 접근자 프로퍼티는 모든 객체가 직접 소유하는 프로퍼티로, 해당 객체의 프로토타입을 교체하는 데에 사용된다.


💡 답

15장 let, const 키워드와 블록 레벨 스코프

A.

  • 수정 전 출력결과: 2,2
  • 부작용 해결 방법: var키워드를 let으로 변경한다.
function foo() {
  let x = 1;

  if (true) {
    let x = 2; 
    console.log(x); 
  }

  console.log(x); 
}

foo();
  • 수정 후 출력결과: 2,1

16장 프로퍼티 어트리뷰트

A.

const person = { age: 25 };
Object.preventExtensions(person);

//Object.preventExtensions는 객체의 확장을 금지. 따라서 Object.isExtensible는 false를 반환.
console.log(Object.isExtensible(person)); // 출력: false

person.name = 'Lee';

// 확장이 금지됐으므로 그대로 출력.
console.log(person); // 출력: { age: 25 }

Object.seal(person);

//Object.seal은 객체의 프로퍼티 추가 및 삭제, 프로퍼티 어트리뷰트 재정의를 금지. 따라서 Object.isSealed는 true를 반환.
console.log(Object.isSealed(person)); // 출력: true

delete person.age;

//delete person.age 금지된 동작이므로 age 프로퍼티가 삭제되지 않음.
console.log(person); // 출력: { age: 25 }

person.age = 100;

//person.age = 100은 기존 프로퍼티 값을 갱신하려는 시도이므로, operson는 { age: 100 }으로 변경.
console.log(person); // 출력: { age: 100 }

17장 생성자 함수에 의한 객체 생성

A. 2️⃣, 5️⃣

  • 2️⃣: 객체 리터럴에 의한 객체 생성 방식은 효율적이지만, 여러 개의 동일한 프로퍼티를 가진 객체를 생성하는 데는 생성자 함수가 더 유용하다.

  • 5️⃣: 생성자 함수의 이름은 관례적으로 대문자로 시작하여야 하며, 이를 통해 일반 함수와 구별된다.

18장 함수와 일급 객체

A. 3️⃣ 함수는 매개변수로 전달할 수 있다.

19장 프로토타입

A. 4️⃣

모든 객체가 직접 소유하는 프로퍼티가 아니라 Object.prototype의 프로퍼티다.

따라서 "모든 객체가 직접 소유하는 프로퍼티"라는 설명은 틀렸다.

객체가 직접 소유하는 프로퍼티는 일반적으로 해당 객체의 프로퍼티들이며, __proto__는 이들 중 하나가 아니다.

profile
개발짜🏃‍♀️

0개의 댓글