Skip to content

Qvil Blog

[Javascript] ECMAScript 2015(ES2015, ES6)사용하기(Feat. Babel)

javascript, es2015, es61 min read

ES2015(이하 ES6)란?

ECMAScript의 표준 ECMA-262의 6번째 에디션을 의미 출처 : 웹Frameworks

  • ECMAScript 2015의 줄임말 => ES2015
  • 6번째 표준이라 ES6라고도 함.

왜 필요한가?

  • 라이브러리들이 최신 언어 명세를 이용해서 작성됨.(예: React.js)
    • 특히 React는 JSX문법을 사용하기 때문에 Babel도 필요함.
  • 표준을 따라가는 것.
  • 편안함.

사용방법

  1. 브라우저에서 그냥 사용
    • 최신 브라우저의 경우 대부분 지원하지만 100%지원이 아님.
  2. Transpiler(Babel) 사용

문법소개

let

var를 대신하는 let키워드는 Block Scope.

예제 - 출처 MDN

1function varTest() {
2 var x = 31;
3 if (true) {
4 var x = 71; // same variable!
5 console.log(x); // 71
6 }
7 console.log(x); // 71
8}
9
10function letTest() {
11 let x = 31;
12 if (true) {
13 let x = 71; // different variable
14 console.log(x); // 71
15 }
16 console.log(x); // 31
17}

const

const는 다른 언어의 constant(상수)와 같음. => 수정 불가.

Example

1const MY_NUMBER = 1;
2MY_NUMBER = 2; // Assignment Error
3const MY_NUMBER = 2; // Declare Error

Class

  • ES6부터 class가 도입되었습니다.
  • class함수입니다.

    Class는 사실 함수입니다. 함수를 함수 표현식과 함수 선언으로 정의할 수 있듯이 class 문법도 class 표현식과 class 선언 두 가지 방법을 제공합니다.

1class MyClass {} // Class 선언
2let MyClass = class {}; // Class 표현식
  • 주의 : 클래스는 호이스팅이 일어나지 않습니다. > 함수 선언과 클래스 선언의 중요한 차이점은 함수 선언의 경우 호이스팅이 일어나지만, 클래스 선언은 그렇지 않다는 것입니다. 클래스를 사용하기 위해서는 클래스를 먼저 선언 해야 하며, 그렇지 않으면, 다음 아래의 코드는 ReferenceError 에러를 던질 것입니다.
1var p = new Polygon(); // ReferenceError
2
3class Polygon {}

자세한 내용보기 : 출처 - MDN

Template String

  • Multi-line String
1console.log('string text line 1
2string text line 2'); // Error
3console.log(`string text line 1
4string text line 2`); // OK

이 블로그 테마에서 Template String 문법이 적용이 안돼서 Syntax Highlighting이 정상적으로 적용되지 않는 것입니다.(JSX도 지원되지 않습니다.) 실제 코드에서 문제 없습니다.

  • Expression Interpolation

    `에 주의하세요 '이 아닙니다.

1let name = "Taesu Hyeon";
2console.log("My name is " + name); // My name is Taesu Hyeon
1let name = "Taesu Hyeon";
2console.log(`My name is ${name}`); // My name is Taesu Hyeon

Arrow Function

  • 짧은 함수
  • 바인딩 되지 않은 this
    • this에 관한 엄격 모드 규칙 무시.
  • 바인딩 되지 않은 arguments
    • 자신의 arguments 객체가 없어서 나머지 매개변수로 대체.
  • 생성자로 사용 안됨. new와 함께 사용 안됨.
  • 파라미터와 화살표 사이에 개행문자 포함 가능.
  • 평범한 함수와 비교해서 operator precedence와 다르게 반응함. ()로 묶어줘야함.
1let callback;
2callback = callback || function() {}; // ok
3callback = callback || () => {}; // SyntaxError: invalid arrow-function arguments
4callback = callback || (() => {}); // ok

출처 : MDN

Syntax

Basic
1(param1, param2,, paramN) => { statements }
2(param1, param2,, paramN) => expression
3 // 다음과 동일함: => { return expression; }
4
5// 매개변수가 하나뿐인 경우 괄호는 선택사항:
6(singleParam) => { statements }
7singleParam => { statements }
8
9// 매개변수가 없는 함수는 괄호가 필요:
10() => { statements }
Advanced
1// 객체 리터럴 식을 반환하는 본문(body)을 괄호 속에 넣음:
2params => ({foo: bar})
3
4// 나머지 매개변수 및 기본 매개변수가 지원됨
5(param1, param2, ...rest) => { statements }
6(param1 = defaultValue1, param2,, paramN = defaultValueN) => { statements }
7
8// 매개변수 목록 내 비구조화도 지원됨
9var f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
10f(); // 6

Example

1// ES5
2var myFunction = {
3 funcLog: function (msg) {
4 return msg;
5 },
6};
7// ES6
8let myFunction = {
9 funcLog: (msg) => msg,
10};
11
12myFunction.funcLog("hi"); // hi

Import

Syntax

1import name from "module-name"; // export default로 export한 멤버를 name에 받음.
2import * as name from "module-name"; // export되는 모든 멤버를 name에 받음.
3import { member } from "module-name"; // export된 멤버 member를 member로 받음.
4import { member as alias } from "module-name"; // export된 멤버 member를 alias로 받음.
5import { member1 , member2 } from "module-name";
6import { member1 , member2 as alias2 , [...] } from "module-name";
7import defaultMember, { member [ , [...] ] } from "module-name";
8import defaultMember, * as alias from "module-name";
9import defaultMember from "module-name";
10import "module-name"; // import만 하면 되는 경우 ex) import "main.css";

Export

Syntax

1export { name1, name2,, nameN };
2export { variable1 as name1, variable2 as name2,, nameN };
3export let name1, name2,, nameN; // 또는 var
4export let name1 =, name2 =,, nameN; // 또는 var, const
5
6export default expression;
7export default function () {} // 또는 class, function*
8export default function name1() {} // 또는 class, function*
9export { name1 as default,};
10
11export * from;
12export { name1, name2,, nameN } from;
13export { import1 as name1, import2 as name2,, nameN } from;
  • Default export스크립트 당 단 하나만 존재 가능.
  • export defaultver, let, const 사용 불가.

    default export의 경우, 모듈 당 딱 하나의 default export가 있습니다. default export는 함수 또는 클래스, 오브젝트, 혹은 다른 것들이 될 수 있습니다. 이값은 가장 간단하게 import 할 수 있도록 하기 때문에 내보낼 값 중 "메인"에 해당하는 값으로 고려해야합니다. 출처 : MDN - export

Spread Operator

Example

1var arrayOne = [2];
2var arrayTwo = [1].concat(arrayOne, [3]); // ES5
3var arrayTwo = [1, ...arrayOne, 3]; // ES6
4console.log(arrayTwo); // [1, 2, 3]
1let objOne = { one: 1 };
2let objTwo = Object.assign({}, objOne); // ES5
3let objTwo = { ...objOne, two: 2 }; // ES6
4console.log(objTwo); // Object {one: 1, two: 2}

Promises

Async Await

참고