자바스크립트

ES6 문법 정리

해리 2021. 4. 4. 01:48

리액트를 다시 공부하면서 생소한 문법(화살표문법 같은?)이 적응이 안되서 ES6 문법에 대해 정리를 해보았다. (모두는 아니고 배운 내용 일부만!)

1. ES6

- ECMAScript 표준의 가장 최신 버전으로 ECMAScript 6 ( ECMAScript 2015 )를 줄인 말이다.

- ES6는 새로운 언어 기능이 포함된 주요 업데이트이며, 2009년도에 표준화된 ES5 이후로 언어 기능에 대한 첫 업데이트다.


2. 추가된 기능

  • arrows
  • classes
  • enhanced object literals
  • template strings
  • destructuring
  • default + rest + spread
  • let + const
  • iterators + for ... of
  • generators
  • unicode
  • modules
  • module loaders
  • map + set + weakmap + weakset
  • proxies
  • symbols
  • subclassable built-ins
  • promicses
  • math + number + string + array + object APIs
  • binary and octal literals
  • reflect api
  • tail calls

2.1 화살표 함수

- 화살표 기호 => 를 사용하여 함수를 선언.

var x = function(x, y) {
    return x * y;
}

// 화살표 함수로 표현
const x = (x, y) => x * y;

 

2.2 클래스

- 기존 자바스크립트 문법은 클래스 표현식이 없었지만 ES6는 클래스를 정의하여 사용할 수 있다.

- class 키워드로 클래스를 정의할 수 있고 클래스 내에 생성자(constructor())도 항상 포함되어 있어야 한다.

// 자동차의 이름과 연도에 대한 정보를 담는 클래스
class Car {
    constructor(name, year) {
        this.name = name;
        this.year = year;
    }
}

// 클래스 객체 생성
let myCar1 = new Car("Ford", 2014);
let myCar2 = new Car("Audi", 2019);

 

2.3 forEach() 함수

- forEach() 함수를 사용하면 반복문의 순번과 배열의 크기를 따로 변수에 저장하는 과정을 생략할 수 있다.

- 구조 분해 할당 방식(키를 넣어주면 키값을 반환)

var fruits = ["apple", "orange", "cherry"];

// 배열의 각 요소를 반복문 forEach()를 이용해 접근
fruits.forEach(myFunction);

// myFunction은 인덱스와 이이템을 출력하는 함수
function myFunction(item, index) {
    document.write(index + ":" + item + "<br>");
}

// for 문 사용시
for (i=0; i<3; i++){
    document.write(i);
    document.write(":" + fruits[i] + "<br>");
}

// 실행 결과
// 0:apple
// 1:orange
// 2:cherry

 

2.4 map() 함수

- 각 배열 요소를 정의된 함수를 통해 변환한 결과값들로 새 배열을 반환.

var persons = [
    {firstname : "Malcom", lastname: "Reynolds"},
    {firstname : "Harry", lastname: "Kim"},
    {firstname : "Pika", lastname: "Chu"}
];

function getFullName(item){
    var fullname = item.firstname + " " + item.lastname;
    return fullname;
}

document.write(persons.map(getFullName));

// 실행 결과
// Malcom Reynolds,Harry Kim,Pika Chu
// 예제 2
var numbers = [1, 4, 9, 16];
var x = numbers.map(Math.sqrt)
document.write(x);

// 실행 결과
// 1,2,3,4

 

2.5 reduce() 함수

- 배열의 각 요소에 대해 주어진 함수를 실행한 후, 하나의 결과값을 반환

- map이 배열의 각 요소를 변형한다면, reduce는 배열 자체를 변형한다.

- 예를 들어, 배열에 들어있는 숫자를 더하거나 평균을 구하는 것을 배열을 값 하나로 줄이는 동작이다.

// 배열.reduce((누적값, 현잿값, 인덱스, 요소) => { return 결과 }, 초기값);

var numbers = [175, 50, 15];

document.write(numbers.reduce(myFunc));

function myFunc(total, num) {
    return total - num;
}

// 실행 결과
// 115

// 이유 : (175, 50) -> (125, 10) -> 115 의 순으로 실행이 된다.

 

2.6 Modules

- JavaScript 모듈 로더들(AMD, CommonJS)의 패턴을 적용

- 묵시적 비동기 형태로 요구되는 모듈들이 정상적으로 로드되기 전까지 코드가 실행되지 않는다.

// lib/math.js
export function sum(x, y) {
    return x + y;
}

export var pi = 3.141593;

// app.js
import * as math from "lib/math";
console.log(math.sum(pi, pi));  // 6.283186
console.log(math.pi);  // 3.141593

 

export defaultexport * 문법도 제공한다.

// module1.js
export default function test() {
    console.log('module1 test');
}

export function test1(){
    console.log('module1 test1');
}

export function test2(){
    console.log('module1 test2');
}

// 또는 이렇게도 가능하다.
function test() {
    console.log('module1 test');
}

function test1(){
    console.log('module1 test1');
}

function test2(){
    console.log('module1 test2');
}

export default test;
export {test1, test2};
// main.js
import test from './module1.js';

// export default로 내보낸 것은 하나의 변수로 받아서 사용할 수 있다.
// test를 받아올 때 이름을 원하는대로 지어도 된다.
import f1 from './module1.js';

// 반면 export는 객체 형태이기 때문에 object destructing을 활용하여 접근이 가능하다.
import {test1, test2} from './module1.js';

// export로 내보내는 이름과 동일해야 하지만 as를 사용해 별칭을 붙여줄 수 있다.
import {test1 as t1, test2 as t2} from './module1.js';

그런데 만약 module1.js에 export로 내보내는 함수가 100개(test1, test2, ..., test100)라 가정해보자.

그렇다면 import 할때 엄청나게 길어지게 될 것이다.

이러한 반복을 방지하기 위해 다음과 같은 문법을 사용할 수 있다.

// main.js
import * as module1 from './module1.js';

//호출하는 방법
module1.test1();
module1.test50();
module1.test100();

 

2.7 Binary and Octal

- 2진법 (b), 8진법 (o) numeric 리터럴 형식이 추가되었다.

0b111110111 === 503  // true
0o767 === 503  // true