코드랩 day2

2018-04-28

Math

  • 32비트 계산 관련
    • Math.imul(): 곲한 값을 32비트로 반환
    • C++ 의 비트와 맞추기 위한 것.
    • Math.clz32(): 32비트 값에서 비트 값이 0인 수
    • Math.fround(): 32비트 부동 소수 값으로 변환, 반올림
  • Emscripten 프로젝트
    • source to source 컴파일러
    • LLVM 컴파일러를 사용하여 자바스크립트 코드 생성

String

Unicode

  • ES6에 유니코드 관련 프로퍼티와 메소드 추가
  • 유니코드는 U+0031 형태
  • 코드 포인트
    • 0031이 코드 포인트, 문자 코드로 알려져있다.
    • 코드 포인트 값으로 문자/기호/이모지/아이콘 표현
    • U+0000 에서 U+10FFFF까지 110만개 이상 표현
  • plane: 코드 포인트 전체를 17개 평면(plane)으로나눔
  • 이스케이프 시퀀스
    • 역슬래시와 16진수 값 3개 작성
    • \x31\x32\x33 -> 123
  • 유니코드 이스케이프 시퀀스
    • \x31\x32\x33 -> \u0031\u0032\u0033
    • UTF-16진수로 U+0000에서 U+FFFF까지 사용 가능
  • 유니코드 코드 포인트 이스케이프
    • U+FFFF보다 큰 포인트를 어떻게 작성할 것인가?
    • \u{34}\u{34}\u{35}

Template

  • Tagged Template
    • 작성 형태
    • const one =1 , two = 2
    • function show(text, value){}
    • show 1+2=$(one+two)

Array

find()

  • 콜백 함수에 넘겨주는 파라미터 및 순서
    • 배열 엘리먼트
    • 인덱스

findIndex()

  • find()와 처리 방법이 같음
    • 하지만 반환 값이 다름.

RegExp

u플래그

  • u(unicode) 플래그
    • 매치 대상을 유니코드로 인식
  • 코드 형태
    • /\u{31}\u{32}/u.test{“12”}

y 플래그

  • 정규 표현식은 매치된 문자열의 인덱스를 lastIndex에 설정
  • y(sticky) 플래그
    • lastIndex 위치부터 매치 수행
    • 디폴트 값 0
    • ^패턴을 사용하지 않으면 첫 문자부터 매치

Generator Object

function*

  • Generator function
    • function* 키워드를 사용한 함수
  • 제너레이터 함수 형태
    • function* 선언문, function* 표현식, GeneratorFunction
  • 제너레이터 함수를 호출하면
    • 함수 블록{}을 실행하지 않고
    • Generator 오브젝트를 생성 (이터레이터 오브젝트) 하여 반환
  • 함수 블록 실행
    • Generator 오브젝트 메서드를 호출할 때
  • new 연산자로 인스턴스 생성 불가

function* 선언문

  • 코드 형태

    function* sports(param1, param2) {
        yield param1 + param2
    };
    const generatorObj = sports(1,2);
    

function* 표현식

GeneratorFunction

  • GeneratorFunction.constructor로 제너레이터 함ㅅ ㅜ생성
    • 문자열로 파라미터 작성

yield

Syntax: [returnValue] = yield[Expression]

  • 코드 형태
    • const result = yield 10 + 20;
  • yield: 제너레이터 함수를 멈추거나 재실행
  • 오른쪽의 표현식을 평가하고 결과 반환
    • 표현식을 작성하지 않으면 undefined반환
  • [[returnValue]]
    • 오른쪽의 평가 결과가 설정되는 것이 아니라
    • 다음 next()에서 파라미터에 정한 값이 설정됨
function* sports(one) {
    const two = yield one; // two에 one값을 할당하지 않음
    const param = yield two + one;
    yield param + one;   
};
const genObj = sports(10);
let result = genObj.next();
console.log(result);

result = genObj.next();
console.log(result);

result = genObj.next(20);
console.log(result);
  • yield 표현식 평가를 완료하면
    • 호출한 곳으로 {value: 값, done: true/false} 형태 반환
  • value 값
    • yield 표현식의 평가 결과 설정
    • yield 처리를 하지 못하면 undefined
  • done 값
    • yield 처리를 수행하면 false
    • 처리하지 못하면 true
    • 더이상 실행할 코드가 없을 때 true
const gen = function*(value) {
    value = value + 10;
    yield ++value;
    value = value + 7;
    yield ++value;
};
const genObj = gen(1);
let result = genObj.next();
console.log(result);

result = genObj.next();
console.log(result);

result = genObj.next();
console.log(result);

next()

  • 함수는 호출될 때 마다 변수에 초깃값 설정
  • 제너레이터는 제너레이터 오브젝트를 생성할 때 설정하고
    • next()로 실행할 때마다 초깃값을 설정하지 않음.
    • 변수의 값이 변경되더라도 유지
  • yield의 왼쪽 변수를
    • 다음 next()의 파라미터 값을 받는 변수로 사용

next() 사례

  • [시나리오]
  • 금액 계산 함수와 할인 금액 계산 함수가 있음
  • 금액 계산 함수는 수량과 단가를 파라미터로 받아
    • 금액을 계산하고 결과를 yield로 반환
  • 할인 금액 계싼 함수 호출
    • yield로 반환한 값을 파라미터 값으로 넘겨 줌
    • 할인 금액을 계산하여 반환
  • 금액 계산 함수를 호출하면서
    • 할인 금액을 파라미터 값으로 넘겨 줌
    • 합계 금액 결과 반환
const getAmount = function*(qty, price) {
    const amount = Math.floor(qty * price);
    const discount = yield amount;
    yield amount - discount;
}
const getDiscount = function(amount){ 
	return amount > 1000 ? amount *0.2 : amount*0.1
}
const amountObj = getAmount(10, 60);
let result = amountObj.next();
console.log(result);

const dcAmount = getDiscount(result.value);
console.log(dcAmount);

result = amountObj.next(dcAmount);
console.log(result);

yield*

syntax: yield* [[expression]]

  • yield* 표현식의 이터러블을 실행한 후
function* gen() {
    yield* [10, 20];
}
const genObj = gen();
let result = genObj.next();
console.log(result);

result = genObj.next();
console.log(result);

result = genObj.next(77);
console.log(result);


Class

class 특징

  • class는 function과 같지만 몇가지 특징이 있다
  • ‘use strict’를 작성하지 않아도 strict 모드에서 실행
  • class안에 메소드 작성
    • getName(){}
    • getName:function(){}형태에서 메소드 이름만 작성
    • 메소드와 메소드 사이에 콤마(,) 작성하지 않음
    • 세미콜론(;) 선택
  • prototype에 연결하여 작성하지 않음
    • class안에 getName(){} 형태로 작성하면
    • 엔진이 프로토타입에 연결된 구조로 변환
    • class밖에 프로토타입을 사용하여 연결 가능
  • class 로 인스턴스를 생성한후
    • 프로토타입에 메소드 추가하면
    • 모든 인스턴스에서 공유
  • 윈도우 오브젝트에 설정되지 않음

constructor

  • class로 인스턴스 생성 및 인스턴스 초기화
  • 디폴트 constructor
    • class에 constructor를 작성하지 않으면 디폴트 생성자 호출
    • 엔진이 class 키워드를만나 class오브젝트를 생성할 때
    • 생성자에서 class전체를 참조하도록 설정
  • 생성자에서 인스턴스가 아닌 다른 값 반환 가능
    • number, string을 반환하면 이를 무시하고 인스턴스 반환
    • 오브젝트를 반환 하게 되면
class Member {
    constructor(name){
        this.name = name
    };
    getName(){
        return this.name
    }
}
const memberObj = new Member('sports');
const result = memberObj.getName();
console.log(result) // sports

  • 생성자에서 Number, String을 리턴하면 이를 무시하고 생성한 인스턴스 반환
  • 생성자에서 Object를 리턴하면 Object가 반환된다

getter

class Member {
    constructor(name){
        this.name = name
    };
    get getName(){
        return this.name
    }
}

const memberObj = new Member('sports');
const result = memberObj.getName;  // 함수 호출이 아닌 getter 호출
console.log(result) // sports

setter

class Member {
    constructor(name){
        this.name = name
    };
    set setName(name){
        this.name = name
    };
    get getName(){
        return this.name
    };
}

const memberObj = new Member();
memberObj.setName = '축구';
const result = memberObj.getName;  // 함수 호출이 아닌 getter 호출
console.log(result) // 축구

상속

  • 상속은 객체지향 기능중에 하나
  • 다른 클래스를 상속받아 메소드와 프로퍼티 사용
  • 상속받을 클래스
    • 부모 클래스, 슈퍼클래스라고 부름
    • 강좌에서는 슈퍼클래스로 사용
    • ES6는 super 키워드로 슈퍼클래스 지칭
  • 상속받는 클래스
    • 자식 클래스, sub클래스 등으로 부름
    • 강좌에서는 서브클래스로 부름
    • 슈퍼와 서브의 시맨틱을 맞추기 위한 것