본문 바로가기

책/Vue.js 퀵스타트

ECMAScript 2015

ECMA2015를 사용하기 위한 프로젝트 설정

  • 프로젝트를 위한 임의이 디렉터리 생성
  • npm init 명령으로 package.json 파일 생성
C:\JetBrains\vscode_workspace\es2015test> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (es2015test)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to C:\JetBrains\vscode_workspace\es2015test\package.json:

{
  "name": "es2015test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes)


   ╭────────────────────────────────────────────────────────────────╮
   │                                                                │
   │      New minor version of npm available! 6.4.1 -> 6.14.9       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v6.14.9   │
   │               Run npm install -g npm to update!                │
   │                                                                │
   ╰────────────────────────────────────────────────────────────────╯

PS C:\JetBrains\vscode_workspace\es2015test>
  • npm install -g babel-cli yarn
  • yarn add -D babel-cli babel-preset-env babel-preset-stage-2
  • 또는 yarn add --save-dev babel-cli babel-preset-env babel-preset-stage-2
    • --save-dev : Babel은 개발 중인 경우에만 사용하므로 --save-dev 옵션 사용
    • babel-preset-env : es2015, es2016, es2017 가장 최신의 프리셋 제공
    • babel-preset-stage-2 : 아직 표준은 아니지만 stage-3를 포함하고 초안상태로 등록된 기능의 프리셋 제공 
  • 프로젝트디렉터리(es2015test)에 .babelrc 파일을 추가하고 다음과 같이 입력
{
    "presets" : ["env","stage-2"]
}
// 사용할 프리셋으로 env, stage-2를 지정한다는 의미
  • babeltest.js 파일 작성
let name = 'world';
console.log(`Hello ${name}`);
  • babel src -d build
C:\JetBrains\vscode_workspace\es2015test>babel src -d build
src\babeltest.js -> build\babeltest.js

C:\JetBrains\vscode_workspace\es2015test>
  • node build/babeltest.js
C:\JetBrains\vscode_workspace\es2015test>node build/babeltest.js
Hello world

C:\JetBrains\vscode_workspace\es2015test>
  • https://babeljs.io/repl/ 에서도 간단하게 트랜스파일 기능을 확인할 수 있음

let, const

var은 함수 단위의 스코프만 지원하므로 블록 단위의 스코프도 지원하기 위해 let 키워드를 도입

let msg = "GLOBAL";
function outer(a) {
    let msg = "OUTER";
    if(true) {
        let msg = "BLOCK";
        console.log(msg);
    }
}


/// babel 변환 
"use strict"

var msg = "GLOBAL";
function outer(a) {
    var msg = "OUTER";
    if(true) {
        var _msg = "BLOCK";
        console.log(msg);
    }
}

 

let, const 는 중복을 허용하지 않음

var a = 100;
var a = 'hello';
var a = { name :'aa', age : 20};


// let, const 는 중복을 허용하지 않음
let a = 100;
let a = 'hello';

기본 파라미터와 가변 파라미터

// 기본 파라미터
function addContact(name, mobile, home="없음",address="", email="") {
    var str = `name=${name}, mobile=${mobile}, home=${home}, address=${address}, email=${email}`;
    console.log(str);
}
addContact('홍길동','010-0000-0000');
addContact('홍길동','010-0000-0000','서울시');


// 가변 파라미터
function addContact(name, age, ...favoriteFoods) {
    console.log(name + ',' + age);
    console.log(favoriteFoods);
}
addContact('홍길동',20);
addContact('홍길동',20, "밥", "짜장면", "빵");

 

구조 분해 할당

let arr = [10, 20, 30, 40, 50];
let [a1, a2, a3] = arr;
console.log(a1, a2, a3);

let p1 = {name: "홍길동", age: 20, gender : 'M'};
let { name:n, age: a, gender } = p1;
console.log(n, a, gender);

function addContact({ name, phone, email="이메일 없음", age=0}) {
    var str = `name=${name}, phone=${phone}, home=${home}, address=${address}, email=${email}`;
    console.log(str);
}
addContact({name: '이몽룡', phone : '010-1111-1111'});

 

화살표 함수

  • 주의할 점: 화살표 함수와 전통적인 함수는 서로 다른 this 값이 바인딩 된다.
function Person(name, yearCount) {
    this.name = name;
    this.age = 0;
    
    var incrAge = function(){
        this.age+;
    }
    for(var i=1; i <= yearCount; i++) {
        incrAge();
        /* 올바른 값이 나오려면 다음과 같이 처리 
        incrAge.apply(this);
        */
    }
}
var p1 = new Person("홍길동", 20);
console.log(p1.age);
// this.age 는 0 이 출력



function Person(name, yearCount) {
    this.name = name;
    this.age = 0;
    
    var incrAge = () => {
        this.age++;
    }
    for(var i=1; i <= yearCount; i++) {
        incrAge();
    }
}
var p1 = new Person("홍길동", 20);
console.log(p1.age);
// this.age 는 20 이 출력

 

새로운 객체 리터럴

var name = "홍길동";
var age = 20;
var email = 'aaa@test.com';

// 객체의 속성과 변수명이 같으면 생략가능
var obj = {
    name,
    age,
    email,
    discount(rate) {

    }
};
/*
var obj = {
    name:name, 
    age:age, 
    email:email, 
    discount: function discount(rate) {

    }
};*/



 

템플릿 리터럴

var d1 = new Date();
var name = "홍길동";
var r1 = `${name} 님에게 ${d1.toDateString()}에 연락했다.`;

var product = "갤럭시";
var price = 199000;
var str = `${product}의 가격은
          ${price}원 입니다.`;
console.log(str);

 

컬렉션

var s1 = new Set();
s1.add("사과");
s1.add("배");
s1.add("사과");
s1.add("포도");
console.log(s1); // Set {'사과','배','포도'};


var ss1 = new Set(['사과','배','포도']);
var ss2 = new Set(['파인애플', '키위', '배']);

// 합집합
var union = new Set([...ss1.values(), ...ss2.values() ]);
console.log(union);

// 교집합
var intersaction = new Set([...ss1.values()).filter(e => ss2.has(e));
console.log(intersaction);

// 차집합
var diff = new Set([...ss1.values()).filter(e => !ss2.has(e));
console.log(diff);


///////////// Map 
// 키 값 쌍이며 키는 고유한 값
let teams = new Map();
teams.set('LG','트윈스');
teams.set('삼성','라이온스');
teams.set('NC','다이노스');
teams.set('기아','타이거즈');
console.log(teams.has('LG'));  //true
console.log(teams.has('SK'));  //false

 

클래스

class Person {
    constructor(name, tel, address) {
        this.name = name;
        this.tel = tel;
        this.address = address;
        if(Person.count) { Person.count++; } else { Person.count = 1; }
    }
    static getPersonCount() {
        return Person.count;
    }
    toString() {
        return `name=${this.name}`;
    }
}
class Emplyee extends Person {
    constructor(name, tel, address, empno, dept) {
        super(name, tel, address);
        this.empno= empno;
        this.dept = dept;
    }
    toString() {
        return super.toString() + `empno=${this.empno}`;
    }
    getEmpInfo() {
        return `${this.empno} : ${this.name}은 ${this.dept} 부서 입니다.`;
    }
}

var p = new Person('이몽룡','010-2222-2222','경기도');
var e = new Emplyee('홍길동','010-2222-2223','서울','A1111','회계팀');
console.log(p.toString());
console.log(e.toString());
console.log(Person.getPersonCount();

 

모듈

  • 독립성을 가진 재사용 가능한 코드 블록, 기본적으로 파일 별로 지역적이나 import, export 구문을 이용외부파일의 객체및 함수를 가져와 재사용할 수 있다.
//==== src/utils/utility1.js 

export let var1 = 100;
export function add(a, b){
    return a+b;
}

/* 또는 
let var1 = 100;
function add(a, b){
    return a+b;
}
export { var1, add };

*/

//==== src/import1.js

// import 할 때 상대경로를 사용한다.
import {add, var1 } from .'/utils/utility1'
console.log(add(4,5));
console.log(var1);


//==== src/import2.js

// 별칭으로 바꿔 사용할 수 있다.
import {add, var1 as v } from .'/utils/utility1'
console.log(add(4,5));
console.log(v);

 

  • 단일 객체일 경우 default 구문을 이용 구조분해 할당을 하지 않고 단일 객체로 가져올 수 있음
//==== src/utils/utility3.js
let calc = {
    add(x,y) { return x+y; },
    multiply(x,y) { return x*y; },
}
export default calc;


//==== src/import.js
import calc from './utils/utility3.js';

console.log(calc.add(4, 5));
console.log(calc.multiply(4, 5));

 

Promise

var p = new Promise(fuction(resolve, reject)) {
    setTimeout(function(){
        var num = Math.round(Math.random()*20);
        var isValid = num % 2;
        if(isValid) { resolve(num); }
        else { reject(num); }
        
    }, 2000);
}).then(function(num){
    console.log("홀수 : " + num);
}).catch(function(num){
    console.log("짝수 : " + num);
});

// fetch.min.js 의 fetch 함수 의 예
fetch(url).then((response) => response.json())
          .then((json) => console.log(json))
          .catch((e) => console.log(e.message));

 

 

전개 연산자

let obj1 = {name: '박문수', age: 29};
let obj2 = { ...obj1 };
let obj3 = { ...obj1, email : 'aaa@bbb.com' };

console.log(obj1 === obj2); // false
console.log(obj3);

let arr1 = [100, 200, 300];
let arr2 = ["hello", ...arr1, "world"];
console.log(arr2);

 

 

' > Vue.js 퀵스타트' 카테고리의 다른 글

컴포넌트 심화  (0) 2020.11.23
Vue-CLI 도구  (0) 2020.11.22
컴포넌트 기초  (0) 2020.11.21
스타일  (0) 2020.11.20
이벤트 처리  (0) 2020.11.20