개발이야기/React

React를 위한 ES6 핵심정리

AndersonChoi 2017. 9. 11. 16:43

 

 

React를 하기 전! ES6문법에 대해 알아야한다.

ES6를 모르고 한다면 여러가지 ES6문법들이 React에 종속된 문법이라고 착각할 수도 있기 때문에 ES6문법에 대한 최소한의 이해는 필수적임.

 

 

주의점

아래 여러가지 기능들은 크롬이나 사파리에서 작동은 잘 되지만, but 제대로 지원이 되지 않을 수도 있으니 Babel(Babel.io)을 사용하여 변환하는 기능을 사용해야한다.

 

 

 

ES2015

ES6 === ES2015

(ES2016, ES2017 ..)

개선된 Javascript 문법.

ES6 Browser compatibility의 휼륭한 지원.

ES6를 기반으로 한 JavaScript 생태계의 확산.

1. scope enhancements ‐ let

ES6 에서는 let 키워드를 사용해서 변수를 사용하면 블럭단위의 스코프를 만들 수 있다.

키워드를 사용하면 됨(따라서, 블록단위로 사용할 때는 let을 사용하는 것을 권장)

var name = 'play ground'; 
function home() {
    var homeName = 'my house';
    for (let i = 0; i<1000; i++){} 
    console.log(i); //i is not defined
}

 

 2. scope enhancements ‐ const(1/2)

const로 선언된 변수는 값을 재할당 할 수 없다.

function home() {
    const homeName = 'my house';
    homeName = 'your house'; 
}
home() //TypeError: Assignment to constant variable.

 

 2. scope enhancements ‐ const(2/2)

const를 사용한다고 불편을 의미하는 것은 아님. const를 사용하더라도 배열과 오브젝트의 값을 변경하는 것은 가능.

function home() {
    const list = ['john', 'adele', 'hary']; list.push('tiger');
    return list;
}
home() //["john", "adele", "hary", "tiger"]

참고 : immutable array를 만드는법

const list = ['john', 'adele', 'hary']; list2 = [].concat(list);
list == list2; //false
 

 

 

 3. Array enhancements ‐ spread operator (1/3)

배열 합치기가 쉬움.

let previousData = ["apple", "orange", 100, 200]; 
let newData = [1,2,3,...previousData];
console.log(newData);
//[1, 2, 3, "apple", "orange", 100, 200]

 

 3. Array enhancements ‐ spread operator (2/3)

새로운 배열로 쉽게 복사 가능. 손쉽게 immutable 객체 생성 가능

let previousData = ["apple", "orange", 100, 200]; 
let newData = [...previousData];
console.log(newData === previousData); //false

 3. Array enhancements ‐ spread operator (3/3)

배열을 function에 개별 파라미터로 전달하기가 쉽다.

function sum(a,b) { return a+b} 
const arr = [4423,42];

//sum.apply(null, arr);
sum(...arr);

 4. Object enhancements

객체를 쉽게 생성. 메서드에 function 키워드도 생략가능.

const name = "nayoun"; 
const age = 9;
const others = {
    address : "kwang myeung city", 
    tel : null,
    height: 130
}
const data = { 
    name,
    age,
    others, 
    getName() {
        return this.name; 
    }
}
console.log(data.getName()); //nayoun

 5. Destructuring

Destructuring은 객체를 모두 전달할 필요없이, 필요한 객체 내부의 변수만 전달이 가능하여 강력하고 간결함

Array Destructuring

let previousData = ["apple", "orange", 100, 200]; 
let [,,applecount, orangecount] = previousData;

 

Object Destructuring

let obj = {
    name : "crong",
    address : "pororo house", 
    age : 12
}
let {name, age} = obj;
console.log(name,age);

// 변수 이름을 변경해서 받을 수도 있음.
let {name:myName, age:myAge} = obj; 
console.log(myName, myAge);
 

 

 

 6. Destructuring practice (1/2)

참고 url : https://gist.github.com/nigayo/787180f0c9756d198df45c2de4fb20db

//make title and imgurl array of mbc
let [,mbc] = news;
let {title,imgurl} = mbc; 
console.log(title,imgurl);

// 또는 이렇게도 가능.
//make title and imgurl array of mbc 
let [,{title,imgurl}] = news; 
console.log(title,imgurl);

 

 6. Destructuring practice (2/2)

참고 url : https://gist.github.com/nigayo/787180f0c9756d198df45c2de4fb20db

//destructuring in function parameters
//let {newslist} = mbc; 와 같이 동작된다고 할 수 있음.
function getNewslist({newslist}) {
    console.log(newslist); 
}
getNewslist(mbc);

//make imgurl array.
var urls = news.map(({imgurl}) => imgurl); 
console.log(urls);

 

 7. template enhancements

템플릿을 활용하여 반복되는 객체에 대해서 간결하게 사용가능. 물론 AngularJS와 같이 멋진 프레임워크들이 있지만 간단한 템플릿의 경우 아래와 같이 사용 가능함.
const data = {
    hour : new Date().getHours(),
    name : "codesquad" 
}
const template = `<div><span>hello! ${data.name}</span></div>` 
console.log(template);

 8. Tagged template literals

tagged template 은 template 문자열의 파싱이 필요한 경우에 사용가능.

function fn(val, name, hour) {
    var ampm = (hour > 11) ? "pm" : "am";
    console.log(val[0], name, val[1], hour, ampm, val[2]);
}
var data = {
    hour : new Date().getHours(),
    name : "solvin" 
}
const template = fn`<div><span>hello! ${data.name}, current time is ${data.hour}</span></div>`;

 9. function enhancements ‐ arrow (1/2)

setTimeout(() => {console.log("hello")}, 1000); 
setTimeout(() => console.log("hello"), 1000);
var newArr = [1,2,3].map((v) => { 
    return v*2;
});
var newArr = [1,2,3].map((v) => (v*2)); 
var newArr = [1,2,3].map((v) => v*2); 
var newArr = [1,2,3].map(v => v*2);

 

 9. function enhancements ‐ arrow (2/2)

주의! arrow를 사용하는 경우, this가 가리키는 부분이 콜백이 실행되는 시점이 아닌 함수가 정의된 시점의 context를 기준으로 함.

 

var obj = { run() {
        setTimeout(function() { 
            console.log(this);
        }, 1000); 
    }
}
obj.run(); //window

var obj = { run() {
    setTimeout(() => { 
        console.log(this);
    }, 1000); }
}
obj.run(); //obj

 

 10. function enhancements ‐ default parameters

기존에는 변수를 모두 안넣어주면 해당 변수는 undefined로 선언됨.
ES6에서는 default parameter를 사용하여 기본값을 선언, 할당 가능.
function sum(value, count=10, size=20) {
    return value * size; 
}
sum(3,10);

 

 11. function enhancements ‐ rest parameters

rest parameter를 활용해 임의의 인자를 배열형태로 받을 수 있다.

rest parameter는 진짜 배열임으로 arguments를 사용해야 하는 상황에서는 더 효과적.

function checkNumber(...arg) {
    const result = arg.every((v) => typeof v === "number");
    console.log(result); 
}
checkNumber(1,2,3,NaN,4,5,null);

 12. ES6 Class

중요! 최근의 js 프레임워크에서 표준으로 쓰임.

class Health { 
    constructor(name, lastTime) {
        this.name = name;
        this.lastTime = lastTime; 
    }

    showHealth() { 
        console.log("오늘은" + this.lastTime + "까지 "+this.name+" 운동을 하셨네요. ");
    }
}
var myHealth = new Health("", "23:11"); 
myHealth.showHealth();
Colored by Color Scripter

 

13. Module. (import, export)

webpack같은것으로 적용 가능하지만, 웹브라우저의 지원범위가 적어서 잘 쓰이지 않는다. 쓸때 주의해야함.
//calculate.js
export const sqrt = Math.sqrt; 
export function square(x) {
    return x * x; 
}
export function diag(x, y) {
    return sqrt(square(x) + square(y)); 
}
//service.js
import { square, diag } from './calculate.js'; 
console.log(square(11)); // 121 
console.log(diag(4, 3)); // 5
//main.html 
<script type="module" src='./src/service.js'></script>

 

 

참고url : https://developers.google.com/web/updates/2017/09/nic61#module

 

End of Document