질문 1. 래퍼 객체가 무엇인지 설명해주세요

원시값인 문자열, 숫자, 불리언 값은 객체처럼 점표기법이나 대괄호 표기법으로 접근하면 자바스크립트 엔진이 일시적으로 원시값을 연관된 객체로 변환하여 프로퍼티에 접근하거나 메서드를 호출할 수 있게 한다. 이 때 일시적으로 변환된는 임시 객체를 래퍼 객체라고 한다.

예를 들어 문자열에 .lenth 로 접근하면 래퍼 객체인 String 생성자의 함수의 인스턴스가 생성되고 문자열은 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된다. 이때 문자열 래퍼 객체인 String 생성자 함수의 인스턴스는 String.prototype의 메서드를 상속받아 사용할 수 있다.그 후 래퍼 객체의 처리가 종료되면 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된 원시값으로 원래의 상태, 즉 식별자가 원시값을 갖도록 되돌리고 래퍼 객체는 가비지 컬렉션의 대상이 된다.

문자열, 숫자, 불리언, 심벌은 암묵적으로 생성되는 래퍼 객체에 의해 마치 객체처럼 사용할 수 있으며, 표준 빌트인 객체인 String, Number, Boolean, Symbol의 프로토타입 메서드 또는 프로퍼티를 참조할 수 있다.

문자열, 숫자, 불리언, 심벌은 마치 객체처럼 프로퍼티에 접근하거나 메서드 함수를 사용할 수 있는데 이는 자바스크립 엔진이 이 원시값들이 점 표기법이나 대괄호 표기법으로 접근하면 일시적으로 객체로 변환시켜주기 때문. 이 객체를 래퍼 객체라 한다. 예를 들어 문자열을 .lenth로 접근하면 래퍼 객체인 String 생성자 함수의 인스턴스를 생성하고 기존 문자열을 내부 슬롯에 할당. String 생성자 함수의 인스턴스는 String.prototype의 메서드를 할당받아서 사용할 수 있음. 이후 래퍼 객체 처리가 종료되면 내부 슬롯에 할당된 원시값으로 되돌리고 래퍼 객체는 가비지 콜렉션의 대상이 된다.

질문 2. eval() 함수를 사용하면 안 되는 이유가 무엇인가요?

eval 함수는 문자열로 된 코드를 평가하거나 실행하는 내장 함수이다.

eval 함수는 문자열을 인수로 전달받는데 전달받은 문자열 코드가 표현식일 경우 코드를 런타임에 평가하여 값을 생성하고, 표현식이 아닌 문이라면 코드를 런타임에 실행하는 함수이다.

eval is evil

eval함수는 caller의 권한으로 수행하는데 이 뜻은 악의적인 문자열을 eval함수로 실행하면 악의적인 코드가 웹페이지나 확장 프로그램의 권한으로 사용자의 기기에서 실행될 수 있기 때문에 보안에 취약.

eval 함수는 JS 인터프리터를 사용하는 함수라서 JS 엔진에 의해 최적화가 수행되지 않아서 처리 속도가 느리다.

대체할 수 있는 구조가 있음 JSON.parse, new Function 등

질문 3. 객체의 프로퍼티에 접근하는 두 방법이 있는데요, 두 방법의 차이점은 무엇인가요?

프로퍼티에는 마침표 표기법과 대괄호 표기법으로 접근할 수 있다. 프로퍼티키가 식별자 네이밍 규칙을 준수하는 이름일 경우 두 방법 모두 사용가능하지만 네이밍 규칙을 준수하지 않는 이름일 경우 대괄호 표기법을 사용해야 한다. 대괄호 표기법의 경우 숫자로 이루어진 문자열을 제외하고 반드시 따옴표로 감싸야 정상적으로 작동한다.