ES6 문법 정리
cleanUrl: /ES6-문법-정리 floatFirstTOC: left

목차
2.1. ES6
2.1.1. const, let ⭐⭐
var 변수를 선언하는 방법부터 배운다. 하지만 var은 이제 const와 let이 대체한다.if (true) { var x = 3; } console.log(x); // 3 if (true) { const y = 3; } console.log(y); // Uncaught ReferenceError: y is not defined
var은 함수 스코프를 가지므로 if문의 블록과 관계없이 접근할 수 있다.const와 let은 블록 스코프를 가지므로 블록 밖에서는 변수에 접근할 수 없다.{ })이다.2.1.1.1 호이스팅 ⭐
console.log(a); // undefined var a = 10; console.log(a); // 10
undefined를 출력한다. 이는 var로 선언된 변수가 호이스팅되어 스코프의 최상단으로 끌어올려졌기 때문이다. 실제로 자바스크립트 엔진은 위 코드를 다음과 같이 해석한다.
var a; console.log(a); // undefined a = 10; console.log(a); // 10
2.1.1.2 일시적 사각지대(Temporal Dead Zone, TDZ) ⭐
const와 let도 사실은 호이스팅 현상이 발생하지만, 조금 다른 방식으로 작동한다. const와 let으로 선언된 변수는 일시적 사각지대(Temporal Dead Zone, TDZ)라는 개념이 적용된다. 이는 변수가 선언되기 전에 접근하려고 하면 ReferenceError가 발생하는 것을 의미한다.TDZ와 관련된 코드 2개를 한번 살펴보자.console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization const a = 10; console.log(a); // 10
let age = 28; function showAge() { console.log(age); // // Uncaught ReferenceError: Cannot access 'age' before initialization let age = 20; // ReferenceError } showAge();
const와 let을 사용하면 값을 할당하기 전에는 TDZ가 죽은 공간으로 만들어버리기에 2.1.1.3 const와 let의 차이
const와 let의 차이는 무엇일까?- const
- 한 번 값을 할당하면 다른 값을 할당할 수 없다.
- 만약 다른 값을 할당하려고 하면 에러가 발생한다.
- 초기화할 때 값을 할당하지 않으면 에러가 발생한다.
- 상수의 개념
- let
- 다른 값을 할당할 수 있다.
- 초기화할 때 값을 할당하지 않아도 된다.
- 변수의 개념
const a = 0; a = 1; // Uncaught TypeError: Assignment to constant variable let b = 0; b = 1; // 1 const c; // Uncaught SyntaxError: Missing initializer in const declaration
const를 사용하고, 다른 값을 할당해야 하는 상황이 생겼을 때 let을 사용하자.2.1.2. 템플릿 문자열
`)으로 감싸면 문자열 안에 변수를 넣을 수 있다.var num1 = 1; var num2 = 2; var result = 3; var string1 = num1 + ' 더하기 ' + num2 + '는 \'' + result + '\''; console.log(string1); // 1 더하기 2는 '3'
const num3 = 1; const num4 = 2; const result2 = 3; const string2 = `${num3} 더하기 ${num4}는 ' ${result2}'`; console.log(string2); // 1 더하기 2는 '3'
2.1.3 객체 리터럴 ⭐⭐
2.1.3.1 객체

2.1.3.2 객체 생성 방법
객체 리터럴Object 생성자 함수생성자 함수Object.create 메서드클래스(ES6)
2.1.3.3 객체 리터럴
let myObject = { member1Name: member1Value, member2Name: member2Value, member3Name: member3Value };
let person = { name: ['Bob', 'Smith'], age: 32, gender: 'male', interests: ['music', 'skiing'], bio: function() { console.log(`${this.name[0]} ${this.name[1]} is ${this.age} years old`); }, greeting: function() { console.log(`Hi! I'm ${this.name[0]}.`); } };
2.1.3.4 프로퍼티 접근
- 마침표 표기법
- 마침표(
.)를 통해 접근하는 방법으로,person.name, person.age와 같이 접근할 수 있다.
- 대괄호 표기법
- 대괄호(
[])를 통해 접근하는 방식으로,persone['name'], persone['age']와 같이 접근한다. - 대괄호를 써서 접근할 경우 따옴표로 감싸주지 않으면
name이란 변수의 값으로 인식하기 때문에 꼭 감싸주어야 한다.
2.1.3.5 프로퍼티 값 갱신 & 생성 & 삭제
- 갱신
- 이미 존재하는 property의 값을 수정하면 갱신된다.
person.name = 'Brown'과 같이 값을 갱신할 수 있다.
- 생성
- 존재하지 않는 property의 값을 할당하면 프로퍼티가 동적으로 생성된다.
person.address = 'Seoul'처럼 새로운 property를 할당할 수 있다.
- 삭제
- 삭제하고자 하는 property를
delete키워드를 붙여 사용한다. - 없는 property에 접근했을 시에 에러없이 무시된다.
delete person.age와 같이 삭제 가능하다.
2.1.3.6 ES6 객체 리터럴
var sayNode = function() { console.log('Node'); }; var es = 'ES'; var oldObject = { sayJS: function() { console.log('JS'); }, sayNode: sayNode, }; oldObject[es + 6] = 'Fantastic'; oldObject.sayNode(); // Node oldObject.sayJS(); // JS console.log(oldObject.ES6); // Fantastic
const newObject = { sayJS() { console.log('JS'); }, sayNode, [es + 6]: 'Fantastic', }; newObject.sayNode(); // Node newObject.sayJS(); // JS console.log(newObject.ES6); // Fantastic
콜론(:)과 function을 붙이지 않아도 된다.sayNode: sayNode 처럼 속성명과 변수명이 동일한 경우에는 한 번만 써도 되게 바뀌었다.{ name: name, age: age } // ES5 { name, age } // ES2015
[es+6]를 해야 했다.[es + 6]가 속성명으로 바로 사용되고 있다.객체 리터럴: 단순한 데이터 구조
- 사용 상황: 데이터만 구조화해서 사용하거나, 단순한 동작을 포함할 때.
- 장점: 선언과 동시에 객체를 생성하며, 간단하고 직관적임.
- 단점: 복잡한 동작이나 상속에는 적합하지 않음.
- 예시: 환경설정 정보 관리
const config = { host: "localhost", port: 3000, database: "myapp", getConnectionString() { return `mongodb://${this.host}:${this.port}/${this.database}`; } }; // 사용 console.log(config.getConnectionString()); // "mongodb://localhost:3000/myapp"
함수: 특정 로직이나 작업을 캡슐화할 때 사용
- 사용 상황: 단일 작업(예: 검증, 처리, 계산 등)을 반복적으로 수행할 때.
- 장점: 모듈화가 용이하며, 재사용성이 높음.
- 단점: 상태를 저장하거나 객체 지향적인 구조를 지원하지 않음.
- 예시: 요청 데이터 검증 로직
function validateUserInput(data) { if (!data.username || data.username.length < 3) { return { isValid: false, error: "Username must be at least 3 characters long." }; } if (!data.email || !data.email.includes("@")) { return { isValid: false, error: "Invalid email format." }; } return { isValid: true }; } // 사용 const userInput = { username: "jo", email: "test@example.com" }; console.log(validateUserInput(userInput)); // { isValid: false, error: "Username must be at least 3 characters long." }
클래스: 상태와 동작을 함께 관리할 때 사용
- 사용 상황: 상태와 동작을 하나로 묶어 관리하거나, 여러 인스턴스를 생성해야 할 때.
- 장점: 상태를 관리하기 쉽고, 상속 및 확장이 가능.
- 단점: 상대적으로 더 많은 코드와 복잡성이 요구됨.
- 예시: 사용자 관리 시스템
class User { constructor(username, email) { this.username = username; this.email = email; } getProfile() { return `${this.username} (${this.email})`; } updateEmail(newEmail) { this.email = newEmail; return this.email; } } // 사용 const user1 = new User("johndoe", "john@example.com"); console.log(user1.getProfile()); // "johndoe (john@example.com)" user1.updateEmail("john.doe@example.com"); console.log(user1.getProfile()); // "johndoe (john.doe@example.com)"
개념 | 예시 | 사용 목적 |
객체 리터럴 | 서버 설정, 고정값 관리 | 간단한 데이터 구조를 정의하고 관리할 때. |
함수 | 데이터 검증, 유틸리티 함수 | 특정 작업이나 로직을 반복적으로 수행할 때. |
클래스 | 사용자 관리, 데이터 모델 정의 | 상태와 동작을 함께 관리하거나 여러 인스턴스가 필요할 때. |
2.1.4 화살표 함수
function add1(x, y) { return x + y; } const add2 = (x, y) => { return x + y; }; const add3 = (x, y) => x + y; const add4 = (x, y) => (x + y);
⇒ 기호로 함수를 선언한다.function not1(x) { return !x; } const not2 = x => !x;
var relationship1 = { name: 'zero', friends: ['nero', 'hero', 'xero'], logFriends: function () { var that = this; // relationship1을 가리키는 this를 that에 저장 this.friends.forEach(function (friend) { console.log(that.name, friend); }); }, }; relationship1.logFriends();
const relationship2 = { name: 'zero', friends: ['nero', 'hero', 'xero'], logFriends() { this.friends.forEach(friend => { console.log(this.name, friend); }); }, }; relationship2.logFriends();
2.1.5. 구조 분해 할당
2.1.5.1 배열 구조 분해
const fruits = ["apple", "banana", "cherry"]; // 구조 분해 할당 const [first, second, third] = fruits; console.log(first); // "apple" console.log(second); // "banana" console.log(third); // "cherry"
const [first, , third] = fruits; console.log(first); // "apple" console.log(third); // "cherry"
const [a, b, c = "default"] = ["x", "y"]; console.log(c); // "default"
2.1.5.2 객체 구조 분해
const user = { name: "John", age: 25, country: "USA" }; // 구조 분해 할당 const { name, age, country } = user; console.log(name); // "John" console.log(age); // 25 console.log(country); // "USA"
const { name: userName, age: userAge } = user; console.log(userName); // "John" console.log(userAge); // 25
const { name, gender = "unknown" } = user; console.log(gender); // "unknown"
2.1.5.3 실제 사용 사례
- API 응답 처리
const response = { data: { user: { id: 1, name: "John" } } }; const { data: { user: { name } } } = response; console.log(name); // "John"
- React의 props 처리
function UserProfile({ name, age }) { return <div>{name} is {age} years old.</div>; }
- 옵션 기본값 설정
function setup({ host = "localhost", port = 8080 } = {}) { console.log(`Connecting to ${host}:${port}`); } setup({ host: "example.com" }); // "Connecting to example.com:8080"
2.1.6 클래스
2.1.6.1 프로토타입 객체
const Hello = function(name) { this.name = name; } Hello['name'] = 'hello' // Hello에는 hasOwnProperty 메소드가 없지만 아래 구문은 동작한다. console.log(Hello.hasOwnProperty('name')); // true console.dir(Hello);

prototype 속성에 정의되어 있다.Hello에 정의한 name 멤버 외에 프로토타입 객체인 Object의 다른 멤버들도 존재함을 알 수 있다.프로토타입이라고 한다.hello.toString(); // [Object object]

2.1.6.2 프로토타입 접근하기
__proto__(deprecated)를 인스턴스에 사용하거나 Object.getPrototypeOf(instance)를 사용할 수 있다.function Hello(name) { this.name = name; } const hello = new Hello('hello'); Object.getPrototypeOf(hello) === Hello.prototype; // true
2.1.6.3 네이티브 객체 프로토타입
Array, String 등의 내장 객체 역시 자신의 프로토타입을 가지고 있다.map, filter 등을 사용해 조작하고 문자열을 선언해 split 등의 연산을 할 수 있게 해주는 이유이다.
const arr = [1,2,3,4,5]; console.log(Object.getPrototypeOf(arr)) //Array prototype const str = "Hello world!"; console.log(Object.getPrototypeOf(str)) //String prototype const date = new Date(); console.log(Object.getPrototypeOf(date)) //Date prototype
2.1.6.4 프로토타입 체인

프로토타입 체인이라고 한다.[[Prototype]]가 가리키는 링크를 따라 부모 역할을 하는 모든 프로토 타입 객체의 속성이나 메소드에 접근할 수 있다.const obj = {hello: 'world'}; const str = 'hello' Object.prototype.hi = function() {console.log('hi')}; obj.hi(); // hi str.hi(); // hi
Object.prototype까지 찾는다.Object.prototype에서도 찾지 못하게 된다면 undefined를 리턴한다.const num = 55; num.push // undefined; num.push() // Uncaught TypeError: num.push is not a function Object.prototype.push = function() {return this + 1}; num.push() // 56;
2.1.6.5 프로토타입의 이점
- 메모리 효율성
- 자바스크립트에서 모든 객체는 프로토타입을 공유한다.
- 객체 자체가 스스로 메소드와 속성을 모두 가지는 대신 여러 객체가 동일한 프로토타입을 공유하도록하고 이를 사용하면 메모리를 효율적으로 사용할 수 있다.
- 객체지향 (스러움)
- 프로토타입을 통해 클래스에서
상속해 사용하는 것 처럼 다른 객체로부터의 속성과 메소드를 사용할 수 있다. - 프로토타입 체인을 통해 가능한 것이며 이를 통해 코드 재사용이 가능해진다.
- 생산성
- 프로토타입을 통해 동일한 속성, 동작이 필요한 여러 객체들마다 이를 직접 선언하고 개발할 필요 없이 프로토타입을 이용해 관리할 수 있다.
Reference
Node.js — Run JavaScript Everywhere
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Node.js 교과서 개정 3판
더북(TheBook): (주)도서출판 길벗에서 제공하는 IT 도서 열람 서비스입니다.

호이스팅(hoisting)_var의 문제점
호이스팅 정의, var의 문제점, const와 let의 호이스팅

📖 객체 리터럴
객체 생성 방법중 하나인 객체리터럴에 대해 알아보자!

JavaScript 객체 기본 - Web 개발 학습하기 | MDN
이 글에서는 JavaScript 객체와 관련된 기본적인 문법을 살펴보고 이전 코스에서 학습해서 이미 알고 있는 JavaScript 의 특징들과 우리가 이미 사용하고 있는 기능들이 이미 객체와 관련되어 있다는 사실을 다시 한번 복습할 것입니다.

JavaScript : 프로토타입(prototype) 이해
JavaScript는 클래스라는 개념이 없습니다. 그래서 기존의 객체를 복사하여(cloning) 새로운 객체를 생성하는 프로토타입 기반의 언어입니다. 프로토타입 기반 언어는 객체 원형인 프로토타입을 이용하여 새로운 객체를 만들어냅니다. 이렇게 생성된 객체 역시 또 다른 객체의 원형이 될 수 있습니다. 프로토타입은 객체를 확장하고 객체 지향적인 프로그래밍을 할 수 있게 해줍니다. 프로토타입은 크게 두 가지로
PoiemaWebPoiemaWeb
PoiemaWeb
웹 프로그래밍 튜토리얼
![[Javascript] Prototype 기본 이해하기](https://images.velog.io/velog.png)
[Javascript] Prototype 기본 이해하기
Javascript 프로토타입? 클래스 기반 언어에서는 클래스 내부에 모든 속성과 메소드가 정의되어있다. 해당 클래스를 기반으로한 객체가 인스턴스로 생성되면 이 객체는 클래스 내부에 정의되어있는 속성과 메소드에 접근하여 사용할 수 있는 형태이다. 프로토타입은 이런
