33장 7번째 데이터 타입 Symbol33.1 심벌이란?심벌은 ES6에서 도입된 7번째 데이터 타입으로 변경 불가능한 원시 타입의 값이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.10.3절 프로퍼티에서 살펴본 바와 같이 프로퍼티 키로 사용할 수 있는 값은 빈 문자열을 포함하는 모든 문자열 또는 심벌 값이다.33.2 심벌 값의 생성33.2.1 Symbol 함수심벌 값은 Symbol 함수를 호출하여 생성한다. 다른 원시값, 즉 문자열, 숫자, 불리언, undefined, null 타입의 값은 리터럴 표기법을 통해 값을 생성할 수 있지만 심벌 값은 Symbol 함수를 호출해 생성해야한다. 이때 생성된 심벌 값은 외..
26장 ES6 함수의 추가 기능26.1 함수의 구분ES6 이전까지 자바스크립트의 함수는 별다른 구분 없이 다양한 목적으로 사용되었다. 자바스크립트의 함수는 일반적인 함수로서 호출할 수도 있고, new 연산자와 함께 호출하여 인스턴스를 생성할 수 있는 생성자 함수로서 호출할 수도 있으며, 객체에 바인딩되어 메서드로서 호출할 수도 있다. 이는 언뜻 보면 편리한 것 같지만 실수를 유발시킬 수 있으며 성능 면에서도 손해다.다음 코드를 살펴보면 ES6 이전의 함수는 동일한 함수여도 다양한 형태로 호출할 수 있다.var foo = function (){ return 1;};//일반 함수로 호출foo();//생성자 함수로 호출new foo();//메서드로 호출var obj = {foo:foo};obj.foo();이..
25장 클래스25.1 클래스는 프로토타입의 문법적 설탕인가?자바스크립트는 프로토타입 기반 객체지향 언어이다. 비록 다른 객체지향 언어와의 차이점에 대한 논쟁이 있긴 하지만 자바스크립트는 강력한 객체지향 프로그래밍 능력을 지니고 있다.프로토타입 기반 객체지향 언어는 클래스가 필요 없는 객체지향 프로그래밍 언어다.ES5에서는 클래스 없이도 생성자 함수와 프로토타입을 통해 객체지향 언어의 상속을 구현할 수 있다.하지만 클래스 기반 언어에 익숙한 프로그래머들은 프로토타입 기반 프로그래밍 방식에 혼란을 느낄 수 있으며, 자바스크립트를 어렵게 느끼게 하는 하나의 장벽처럼 인식되었다.ES6에서 새롭게 도입된 클래스는 기존 프로토타입 기반 객체지향 프로그래밍보다 자바나 C#과 같은 클래스 기반 객체지향 프로그래밍에 익..
24장 클로저클로저는 난해하기로 유명한 개념 중 하나로 앞서 살펴본 실행 컨텍스트에 대한 사전 지식이 있으면 이해하기 어려운 개념은 아니다.클로저는 자바스크립트 고유 개념은 아니기 때문에 ECMAScript 사양에 등장하지 않는다.MDN에서는 클로저를 다음과 같이 정의하고 있다.클로저는 함수와 그 함수가 선언된 렉시컬 환경과의 조합이다.24.1 렉시컬 스코프렉시컬 스코프를 실행 컨텍스트의 관점에서 다시 한번 살펴보자.자바스크립트 엔진은 함수를 어디서 호출했는지가 아니라 함수를 어디에 정의했는지에 따라 상위 스코프를 결정한다. 이를 렉시컬 스코프(정적 스코프)라 한다.const x = 1;function foo(){ const x = 10; bar();}function bar(){ console.lo..
23장 실행 컨텍스트실행 컨텍스트는 자바스크립트의 동작 원리를 담고있는데, 바르게 이해한다면 자바스크립트가 스코프를 기반으로 식별자와 식별자에 바인딩된 값을 관리하는 방식과 호이스팅이 발생하는 이유, 클로저의 동작 방식, 그리고 태스크 큐와 함께 동작하는 이벤트 핸들러와 비동기 처리의 동작 방식을 이해할 수 있다.23.1 소스코드의 타입ECMAScript 사양은 소스코드를 4가지 타입으로 구분한다. 각 소스코드는 실행 컨텍스트를 생성한다.소스코드의 타입설명전역 코드전역에 존재하는 소스코드. 전역에 정의된 험수, 클래스 등의 내부 코드는 포함되지 않음함수 코드함수 내부에 존재하는 소스코드. 함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함되지 않음eval 코드빌트인 전역 함수인 eval 함수에 인수..
this22.1 this 키워드19장 "객체지향 프로그래밍"에서 살펴보았듯 객체는 상태를 나타내는 프로퍼티와 동작을 나타내는 메서드를 하나의 논리적인 단위로 묶은 복합적인 자료구조다.동작을 나타내는 메서드는 자신이 속한 객체의 프로퍼티를 참조하고 변경할 수 있어야한다. 이때 메서드가 자신이 속한 객체의 프로퍼티를 참조하려면 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야한다.객체 리터럴 방식으로 생성한 객체의 경우 메서드 내부에서 메서드 자신이 속한 객체를 가리키는 식별자를 재귀적으로 참조할 수 있다.const circle = { radious: 5, getDiameter(){ return 2*circle.radius; }};console.log(circle.getDiameter(..