- 객체지향 프로그래밍이란 무엇인가?
: 전통적인 명령형 프로그래밍에서 벗어나 독립적 단위인 객체의 집합으로 프로그램을 표현하는 프로그래밍 패러다임
: 여기서의 객체는 속성의 집합이고 속성은 다시 상태와 동작으로 구분할 수 있는데, 상태를 프로퍼티, 동작을 메서드라고 부름
: 또한 객체는 다른 객체와 관계성을 가질 수 있기 때문에 메시지를 주고 받거나 다른 객체의 프로퍼티나 메서드를 상속 받아 사용할 수 있음
- 상속이란 무엇인가?
: 객체지향 프로그래밍의 핵심 개념
: 어떤 객체의 프로퍼티, 메서드를 다른 객체가 상속 받아 그대로 사용할 수 있는 것
- 상속을 왜 사용하는가?
: 코드의 재사용이라는 관점에서 유용하게 사용할 수 있음
- 자바스크립트에서는 상속을 어떻게 구현하는가?
: 프로토타입을 기반으로 구현하여 불필요한 중복을 제거하는 방식
: 기존 생성자 함수는 인스턴스를 생성할 때마다 메서드도 생성한다는 단점이 있는데, 이를 상속으로 해결 가능
: 인스턴스가 공통적으로 사용할 프로퍼티와 메서드를 프로토타입에 구현해 두면, 인스턴스는 상위 객체인 프로토타입에서 상속 받아 사용 가능
- 프로토타입 객체란 무엇인가?
: 프로토타입과 동일한 용어, 프로토타입도 객체이기 때문
: 자바스크립트에서 객체 간의 상속을 구현하기 위해 사용하는 개념
: 어떤 객체의 상위 객체 역할을 하며, 다른 객체에 공유 프로퍼티를 제공함
: 모든 객체가 가지고 있는[[Prototype]]
내부 슬롯이 가리키는 것이 프로토타입 객체
- 프로토타입 객체에 어떻게 접근할 수 있는가?
: 내부 슬롯이기 때문에 직접 접근은 불가능
: 인스턴스는__proto__
접근자 프로퍼티를 통해 간접적 접근 가능
: 생성자 함수는 자신이 가지고 있는prototype
프로퍼티를 통해 접근 가능
- 인스턴스에서 생성자 함수로 어떻게 접근할 수 있는가?
: 인스턴스의 프로토타입이 가지는
constructor
프로퍼티를 상속 받아 사용하면 생성자 함수로 접근 가능
__proto__
접근자 프로퍼티란 무엇인가?: 객체가 자신의 프로토타입, 즉
[[Prototype]]
내부 슬롯에 간접적으로 접근할 수 있는 방법
__proto__
는 어떤 특징이 있는가?: 접근자 프로퍼티이기 때문에 디스크립터 객체를 확인해보면 getter, setter 함수를 프로퍼티로 가짐
:__proto__
로 프로토타입에 접근하면 getter 함수인[[Get]]
호출, 새로운 프로토타입을 할당하면 setter 함수인[[Set]]
호출
:__proto__
는 객체가 직접 소유하는 프로퍼티가 아니라 모든 객체가 상속 받는Object.prototype
의 접근자 프로퍼티이고, 상속을 받기 때문에 자유롭게 사용 가능
Object.prototype
이란 무엇인가?: 모든 객체가 상속 받는 프로토타입, 이 객체의 프로퍼티와 메서드는 모든 하위 객체가 자유롭게 사용할 수 있음
: 프로토타입 체인의 종점에 위치한 최상위 프로토타입 객체
__proto__
를 통해 프로토타입에 접근하는 이유는 무엇인가?: 상호 참조에 의해 프로토타입 체인이 생성되는 것을 방지하기 위해, 즉 순환 참조에 의한 무한 루프 에러를 방지하기 위한 목적
:__proto__
를 통해 프로토타입에 단방향으로 접근 및 교체하고 있는지 체크 가능
__proto__
의 직접 사용을 권장하지 않는 이유는 무엇인가?: 모든 객체가
__proto__
를 상속 받아 사용할 수 있는 것은 아니기 때문에 에러가 발생할 위험이 있음
: 상속을 받지 않아도 되는 정적 메서드Object.getPrototypeOf
,Object.setPrototypeOf
사용하는 것이 바람직함
prototype
프로퍼티란 무엇인가?: 함수 객체가 가지는 고유한 프로퍼티
: 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킴
prototype
프로퍼티는 어떤 특징이 있는가?:
[[Construct]]
프로퍼티를 가지지 않는 메서드 축약 표현, 화살표 함수는prototype
프로퍼티를 가지지 않고, 프로토타입도 생성하지 않음
: 생성자 함수와 마찬가지로 일반 함수도prototype
프로퍼티를 가지긴 하지만, 객체를 생성하지 않기 때문에prototype
의 의미가 없음
protoype
프로퍼티와__proto__
접근자 프로퍼티를 통해 프로토타입에 접근하는 방법은 어떤 차이가 있는가?: 가리키는 프로토타입은 생성자 함수의
prototype
프로퍼티로 동일함
: 프로토타입 사용의 주체가 누군지의 차이가 있음
:prototype
프로퍼티는 생성자 함수가 자신이 생성할 인스턴스에 프로토타입을 할당하기 위해 사용
:__proto__
접근자 프로퍼티는 인스턴스가 자신의 프로토타입에 접근 및 교체하기 위해 사용
- 생성자 함수와
constructor
프로퍼티의 연결 시점은 언제인가?: 생성자 함수의 정의가 평가될 때, 즉 함수 객체가 생성될 때 프로토타입의
constructor
프로퍼티와 연결됨
- 인스턴스와
constuctor
프로퍼티는 어떤 관계가 있는가?: 인스턴스는 프로토타입으로 생성자 함수의
prototype
프로퍼티와 연결되어 있으므로,constructor
프로퍼티를 사용하여 자신을 생성한 생성자 함수에 접근할 수 있음
- 리터럴 표기법으로 생성한 객체는 프로토타입을 가지는가?
:
new
연산자를 사용하여 생성자 함수를 거치지 않고 바로 객체를 생성하기 때문에 프로토타입이 존재하지 않을 것이라고 생각할 수 있음
: ECMAScript 사양에 명시된 추상 연산 OrdinaryObjectCreate이 관여하여 프로토타입이 생성됨
: 추상 연산에 의해 프로토타입과 연결됨으로써 가상적인 생성자 함수를 가지게 됨, 프로토타입은 생성자 함수와 함께 생성되고prototype
과constructor
프로퍼티를 통해 서로 연결되어 있기 때문
- 추상 연산이란 무엇인가?
: ECMAScript 사양에서 자바스크립트 엔진의 내부 동작 구현 알고리즘을 표현한 것
Object
생성자 함수로 생성하는 객체의 경우 호출된 OrdinaryObjectCreate는 어떻게 동작하는가?: 인수가 전달되지 않았다면 연산 호출하여 빈 객체 생성
: 인수가 전달된 경우 인수를 객체로 변환하여 생성
:new.target
이 undefined나 Object가 아닌 경우 중간에 인스턴스의 프로토타입을 삽입하여 프로토타입 체인 생성
- 객체 리터럴로 생성하는 객체의 경우 호출된 OrdinaryObjectCreate는 어떻게 동작하는가?
: 첫 번째 매개변수로 생성할 객체의 프로토타입인
Object.prototype
지정
: 두 번째 매개변수는 옵션, 리터럴 안에 프로퍼티가 정의되어 있다면 객체 생성 시 이를 추가할 수 있음
- 다양한 리터럴 표기법에 따라 생성자 함수와 프로토타입은 어떻게 연결되는가?
: 객체 리터럴인 경우
Object
,Object.prototype
연결
: 함수 리터럴인 경우Function
,Function.prototype
연결
: 배열 리터럴인 경우Array
,Array.prototype
연결
: 정규 표현식 리터럴인 경우RegExp
,RegExp.prototype
연결
- 프로토타입은 언제 생성되는가?
: 생성자 함수가 생성되는 시점에 함께 생성
- 생성자 함수는 어떻게 구분할 수 있는가?
: 사용자 정의 생성자 함수, 빌트인 생성자 함수
- 사용자 정의 생성자 함수의 경우 프로토타입이 언제 생성되는가?
: 함수의 정의가 평가되는, 즉 함수 객체가 생성되는 시점에 프로토타입 생성
: 생성자 함수가 함수 선언문으로 정의되었다면 소스코드 런타임 이전에 생성, 함수 표현식으로 정의되었다면 할당문 런타임 시 생성
: 프로토타입이 생성된 직후에는constructor
프로퍼티만 가지고 있음
: 프로토타입도 객체이기 때문에 내부 슬롯인[[Prototype]]
은Object.prototype
을 가리키고 있음
- 빌트인 생성자 함수의 경우 프로토타입이 언제 생성되는가?
: 빌트인 생성자 함수는 전역 객체가 생성되는 시점에 전역 객체의 프로퍼티로서 생성됨, 즉 프로토타입도 전역 객체가 생성되는 시점에 생성
: 결국 객체 생성 이전에 생성자 함수와 그 프로토타입은 이미 객체화되어 전역 객체의 프로퍼티로 포함되어 있음
- 객체를 생성하는 방식에는 어떤 것들이 있는가?
: 객체 리터럴,
Object
생성자 함수, 사용자 정의 생성자 함수,Object.create
메서드, 클래스
- 객체 생성 방식의 공통점은 무엇인가?
: 세부적인 차이는 있지만, 전부 추상 연산 OrdinaryObjectCreate에 의해 생성됨
- 객체의 프로토타입은 언제 결정되는가?
: OrdinaryObjectCreate의 동작 과정 중에 결정됨
(1) 추상 연산 OrdinaryObjectCreate는 필수적으로 자신이 생성할 객체의 프로토타입을 인수로 전달 받고, 생성할 객체에 추가할 프로퍼티 목록을 옵션으로 전달할 수 있음
(2) 일단 OrdinaryObjectCreate는 무조건 빈 객체를 생성함
(3) 프로퍼티 목록을 전달 받았다면 객체에 프로퍼티를 추가함
(4) 전달 받은 프로토타입을
[[Prototype]]
에 할당함, 결국 프로토타입은 OrdinaryObjectCreate에 전달되는 인수에 의해 결정됨, 이때의 인수는 객체 생성 방식에 따라 달라짐
- 객체 리터럴에 의해 생성된 객체의 프로토타입은 무엇인가?
: 자바스크립트 엔진이 객체 리터럴을 평가할 때 OrdinaryObjectCreate 호출하고, 인수로
Object.prototype
전달함
: 결국 객체 리터럴에 의해 생성되는 객체는Object.prototype
을 프로토타입으로 가지고,Object.prototype
을 통해 상속 받은 프로퍼티와 메서드 사용 가능
- Object 생성자 함수에 의해 생성된 객체의 프로토타입은 무엇인가?
: 객체 리터럴에 의해 생성되는 객체와 구조는 동일, 마찬가지로
Object.prototype
을 프로토타입으로 가짐
: 마찬가지로Object.prototype
을 통해 상속 받은 프로퍼티와 메서드 사용 가능
- 객체 리터럴과
Object
생성자 함수의 객체 생성 방식에는 어떤 차이가 있는가?: 프로퍼티의 추가 방식에 차이가 있음
: 객체 리터럴은 리터럴 내부에 프로퍼티를 추가하여 생성할 수 있음
: 생성자 함수는 일단 무조건 빈 객체를 생성하고, 그 후에 프로퍼티를 추가해야 함
- 사용자 정의 생성자 함수에 의해 생성된 객체의 프로토타입은 무엇인가?
:
new
연산자와 함께 생성자 함수를 호출하여 인스턴스 생성하면 OrdinaryObjectCreate가 호출되고, 인수로 생성자 함수의prototype
프로퍼티에 바인딩된 객체(생성자 함수 이름.prototype
)를 전달함
: 이때 생성자 함수와prototype
프로퍼티에 바인딩된 객체 사이의 연결이 생성됨
: 그러므로 생성자 함수의prototype
프로퍼티에 바인딩된 객체의 프로퍼티와 메서드 사용 가능, 그러나 생성한 직후에는constructor
프로퍼티만 존재하기 때문에contructor
프로퍼티만 상속 받아 사용 가능
: 프로토타입 체인을 통해Object.prototpye
의 프로퍼티와 메서드 역시 상속을 받아서 사용 가능
- 프로토타입 체인이란 무엇인가?
: 내부 슬롯
[[Prototype]]
에 바인딩된 객체끼리 연결되어 있는 것
: 자바스크립트 엔진이 프로퍼티를 검색하는 규칙**
- 자바스크립트 엔진은 프로토타입 체인을 통해 구체적으로 프로퍼티를 어떻게 검색하는가?
: 먼저 메서드를 호출한 객체에서 검색, 없으면 객체에 바인딩된 프로토타입에서 검색
: 프로토타입 체인을 타고 올라가서 종점인Object.prototype
에서 검색하고, 만약 없으면undefined
반환
- 프로토타입 체인의 종점은 무엇인가?
: 모든 객체는
Object.prototype
을 상속 받기 때문에, 프로토타입 체인의 최상위 객체는Object.prototype
: 프로토타입 체인의 최상위 객체인Object.prototype
가 바로 종점
: 종점이기 때문에Object.prototype
의[[Prototype]]
에는null
이 할당되어 있음
- 프로토타입 체인은 왜 존재하는가?
: 객체 간의 상속과 프로퍼티 검색을 위해
- 스코프 체인과 프로토타입 체인은 어떤 차이가 있는가?
: 스코프 체인은 식별자를 검색하는 규칙
: 프로토타입 체인은 프로퍼티를 검색하는 규칙
: 두 규칙이 개별적으로 동작하는 것이 아니라 서로 협력하여 사용됨
- 프로토타입 프로퍼티와 인스턴스 프로퍼티는 어떤 차이가 있는가?
: 프로토타입이 소유한 프로퍼티를 프로토타입 프로퍼티, 인스턴스가 소유한 프로퍼티를 인스턴스 프로퍼티라고 함
- 오버라이딩이란 무엇인가?
: 상속 받은 프로토타입 프로퍼티를 인스턴스에 추가하는 경우 인스턴스 프로퍼티가 프로토타입 프로퍼티를 오버라이딩했다고 표현
: 즉 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의하여 사용하는 방식
- 프로퍼티 섀도잉이란 무엇인가?
: 상속에 의해 프로토타입 프로퍼티가 인스턴스 프로퍼티에게 가려지는 현상을 의미함
- 인스턴스 프로퍼티를 통해 프로토타입 프로퍼티를 삭제할 수 있는가?
: 오버라이딩한 인스턴스 프로퍼티를 통해 프로토타입 프로퍼티를 삭제할 수는 없음
: 즉 하위 객체에서 프로토타입에get
메서드는 허용되지만,set
메서드는 허용되지 않음
: 프로토타입 프로퍼티를 변경하거나 삭제하려면 생성자 함수의prototype
프로퍼티를 통해 직접 접근해야 함
- 프로토타입의 교체란 무엇을 의미하는가?
: 프로토타입을 임의의 다른 객체로 변경하는 것, 즉 부모 객체인 프로토타입을 동적으로 변경할 수 있는 것을 의미함
: 프로토타입의 교체를 통해서 객체 간의 상속 관계를 동적으로 변경할 수 있음
- 프로토타입은 어떻게 교체할 수 있는가?
: 생성자 함수에 의해 교체하거나, 인스턴스에 의해 교체할 수 있음
- 생성자 함수에 의해 프로토타입을 어떻게 교체할 수 있는가?
: 생성자 함수의
prototype
프로퍼티에 프로토타입으로 사용할 임의의 객체를 할당하면 됨
: 교체하면prototype
의 프로퍼티로 할당한 객체에constructor
프로퍼티가 존재하지 않기 때문에 생성자 함수와constructor
프로퍼티 간의 연결이 파괴됨, 그 결과 인스턴스의constructor
값은 인스턴스를 생성한 생성자 함수가 아닌,Object
생성자 함수를 가리킴
- 생성자 함수에 의해 프로토타입을 교체할 때
constructor
와 생성자 함수 간의 끊어진 연결을 어떻게 복구할 수 있는가?: 생성자 함수의
prototype
에 객체를 할당할 때constructor
프로퍼티를 추가하면 됨(키에는constructor
, 값에는 생성자 함수 이름)
- 생성자 함수에 의해 프로토타입을 어떻게 교체할 수 있는가?
: 인스턴스의
__proto__
접근자 프로퍼티를 통해 프로토타입에 접근 가능
: 즉 프로토타입으로 사용할 임의의 객체를__proto__
의set
메서드나Object.setPrototypeOf
메서드의 매개변수로 설정하여 교체 가능
: 메서드의 매개변수로 설정한 객체에constructor
프로퍼티가 없기 때문에 생성자 함수와constructor
프로퍼티 간의 연결이 파괴됨, 그 결과 인스턴스의constructor
값은 생성자 함수가 아닌,Object
생성자 함수를 가리킴
- 인스턴스에 의해 프로토타입을 교체할 때
constructor
와 생성자 함수 간의 끊어진 연결을 어떻게 복구할 수 있는가?: 매개변수로 설정할 객체를 생성할 때
constructor
프로퍼티를 추가하면 됨(키에는constructor
, 값에는 생성자 함수 이름)
: 추가적으로 생성자 함수의prototype
프로퍼티에 객체를 할당해주는 작업이 필요함
- 프로토타입 교체 시 생성자 함수에 의한 방식과 인스턴스에 의한 방식은 어떤 차이가 있는가?
: 생성자 함수는 생성할 인스턴스의 프로토타입을 교체하는 것
: 인스턴스는 생성된 인스턴스의 프로토타입을 교체하는 것
: 생성자 함수는prototype
프로퍼티의 값에 직접 접근하여 객체를 할당하기 때문에 프로퍼티의 값이 교체된 프로토타입을 가리키고 있음
: 인스턴스는prototype
프로퍼티의 값으로 객체를 할당하는 것이 아니라, 객체를 프로토타입 자체로 만들어서 교체하기 때문에 생성자 함수의prototype
프로퍼티가 교체된 프로토타입을 가리키지 않음
- 프로토타입의 교체는 어떤 단점이 있는가?
:
constructor
프로퍼티를 따로 추가하거나,prototype
의 값으로 객체를 할당해주는 작업이 필요하기 때문에 번거로움
: 번거로움을 해결하기 위해 직접 상속, 클래스 사용
instanceof
연산자란 무엇인가?: 이항 연산자로 좌변에 객체를 가리키는 식별자를, 우변에 생성자 함수를 가리키는 식별자를 피연산자로 각각 받음
: 우변의 피연산자가 함수가 아닌 경우 TypeError 발생
instanceof
연산자는 어떻게 동작하는가?: 우변의 생성자 함수의
prototype
프로퍼티에 바인딩된 객체가 좌변의 객체의 프로토타입 체인 상에 존재하면true
, 아니면false
반환함
: 인스턴스에서 프로토타입을 임의로 교체하는 경우에 교체 전 프로토타입에 바인딩되었던 생성자 함수는false
를 반환하게 됨
: 즉 생성자 함수의prototype
프로퍼티에 바인딩된 객체가 프로토타입 체인 상에 존재하는지 확인함
: 만약 생성자 함수에 의해 프로토타입을 교체하는 경우에는 생성자 함수와 교체된 프로토타입 간의 연결이 끊기지 않기 때문에instanceof
반환 값에 영향을 주지 않음
- 직접 상속의 방법에는 무엇이 있는가?
:
Object.create
이용, 객체 리터럴 내부에서__proto__
이용
Object.create
란 무엇인가?:
Object.create
는 명시적으로 프로토타입을 지정하여 객체를 생성하는 방식
: 객체 리터럴,Object
생성자 함수와 마찬가지로 추상 연산 OrdinaryObjectCreate를 호출함
Object.create
는 어떻게 동작하는가?: 첫 번째 매개변수에 필수적으로 생성할 객체의 프로토타입으로 지정할 객체 전달
: 두 번째 매개변수에는 선택적으로 생성할 객체의 프로퍼티 키와 프로퍼티 디스크립터로 이뤄진 객체 전달
: 결과적으로 첫 번째 매개변수에 전달한 객체의 프로토타입 체인에 속하는 객체가 생성됨
Object.create
의 장점은 무엇인가?:
new
연산자 필요 없음
: 프로토타입을 직접 지정하면서 동시에 객체 생성 가능
: 객체 리터럴에 의해 생성된 객체도 상속 받을 수 있음
- 객체 리터럴 내부에서
__proto__
를 이용하여 직접 상속을 구현하는 이유는 무엇인가?: 기존
Object.create
는 두 번째 매개변수로 프로퍼티를 추가하는 것이 번거로움
: 객체 리터럴 내부에서 직접 상속을 구현하면 프로퍼티를 간편하게 추가함으로써 이를 해결할 수 있음
- 객체 리터럴 내부에서
__proto__
를 이용하여 어떻게 직접 상속을 구현할 수 있는가?: 객체 내부에
__proto__
접근자 프로퍼티를 정의하고, 그 값으로 직접 상속을 구현할 객체를 할당함
: ES6 이후부터 사용 가능한 방법임
- 정적 프로퍼티/메서드란 무엇인가?
: 생성자 함수로 인스턴스를 생성하지 않아도 참조, 호출할 수 있는 프로퍼티/메서드를 의미함
: 생성자 함수도 객체이기 때문에 자기 자신의 프로퍼티/메서드를 소유할 수 있는데, 이것이 바로 정적 프로퍼티/메서드
: 정적 프로퍼티/메서드는 인스턴스의 프로토타입 체인에 존재하지 않기 때문에 인스턴스가 참조할 수 없음
- 어떤 경우에 정적 프로퍼티/메서드로 변경할 수 있는가?
: 인스턴스/프로토타입 메서드 내에서
this
를 사용하지 않는 경우 정적 메서드로 변경할 수 있음
:this
가 가리키는 것이 인스턴스이므로, 굳이 참조할 필요가 없다면 정적 메서드로 변경해도 정상 동작하기 때문
- 정적 프로퍼티/메서드로 어떻게 변경할 수 있는가?
: 중간에
prototype
프로퍼티를 체이닝하는 과정을 거치지 않으면 됨
ex)Foo.prototype.x
→Foo.x
- 정적 프로퍼티/메서드와 프로토타입 프로퍼티/메서드를 어떻게 구분할 수 있는가?
: 표기법 자체가 다름
:prototype
프로퍼티를 중간에 체이닝하고 있다면 프로토타입 프로퍼티/메서드, 아니라면 정적 프로퍼티/메서드
: 중간에 체이닝된prototype
프로퍼티를#
으로 표기하는 경우도 있음
- 프로퍼티의 존재를 확인하는 방법에는 무엇이 있는가?
:
in
연산자,Object.prototype.hasOwnProperty
메서드
in
연산자란 무엇인가?: 객체 내에 특정 프로퍼티가 존재하는지 여부를 확인하기 위한 연산자
:프로퍼티 키 in 객체
와 같은 방식으로 사용할 수 있음
: 객체 고유의 프로퍼티뿐 아니라 객체의 프로토타입 체인 상에 있는 모든 프로퍼티를 확인하여 불리언 값을 반환함
Reflect.has
는 무엇인가?: ES6에 추가된
in
연산자의 대체재로in
연산자와 동일하게 동작
:Reflect.has(객체, 프로퍼티 키)
와 같은 방식으로 사용할 수 있음
Object.prototype.hasOwnProperty
란 무엇인가?: 객체 내에 특정 프로퍼티가 존재하는지 여부를 확인하는 메서드
: 객체 고유의 프로퍼티인 경우에만true
를 반환함
: 상속 받은 프로퍼티인 경우에는false
를 반환함
- 프로퍼티를 열거하는 방법에는 무엇이 있는가?
:
for in
문,Object.keys/values/entries
메서드
for in
문이란 무엇인가?: 객체의 모든 프로퍼티를 순회하며 열거할 때 사용하는 문
:for (변수 선언문 in 객체) { ... }
와 같은 방식으로 사용할 수 있음
: 객체의 프로퍼티 개수만큼 순회, 변수 선언문에 프로퍼티의 키를 할당함
: 순회 대상 객체의 프로퍼티뿐 아니라 객체가 상속 받은 프로토타입의 프로퍼티까지 열거함, 그러나 열거되지 않는 프로퍼티도 있음
: 객체 자신의 프로퍼티만 열거하려면 우선Object.prototype.hasOwnProperty
로 확인 필요
for in
문 사용 시 열거되지 않는 프로퍼티는 무엇인가?: 프로퍼티 어트리뷰트 중 내부 슬롯
[[Enumerable]]
의 값이false
인 경우 열거할 수 없음
: 프로퍼티 키가Symbol
인 경우에도 열거하지 않음
- 배열을 순회할 때
for in
문을 사용하는 것이 바람직한가?: 배열을 순회할 때는
for
문,for of
문, 배열 프로토타입 메서드forEach
사용을 권장
:for in
문은 배열 요소뿐만 아니라 프로퍼티까지 같이 반환하기 때문
Object.keys/values/entries
의 특징은 무엇인가?: 객체 자신의 고유 프로퍼티만 열거하는 메서드
Object.keys
란 무엇인가?: 객체 자신의 열거 가능한 프로퍼티 키를 배열로 반환하는 메서드
Object.values
란 무엇인가?: 객체 자신의 열거 가능한 프로퍼티 값을 배열로 반환하는 메서드
Object.entries
란 무엇인가?: 객체 자신의 열거 가능한 프로퍼티 키와 값의 쌍을 배열로 반환하는 메서드