업데이트:

ES6

let와 const

  • 블록범위에서 유효한 변수 선언 키워드
  • 전역에 let이나 const로 window객체 프로퍼티와 동일한 변수명을 사용하면, window객체 프로퍼티에 영향을 주지 않고 임시로 사용한다는 개념으로 변수를 선언할 수 있음.

(var로 window 프로퍼티와 동일한 변수명으로 선언시, window 프로퍼티 값을 덮음)

let

  • 같은 블록범위 내에서 이미 선언된 동일한 변수명은 선언할 수 없음.
  • hoisting이 발생하지 않아, 선언전에 변수명을 호출할 경우 오류발생.
  • 반복문 문제해결
var button = document.querySelectorAll("button");
for (var i = 0; i < 3; i++) {
  button[i].onclick = function() {
    console.log(i); // 모두 2를 출력, 이유는 i변수는 같은 값을 참조하므로 이미 for문으로 변경된 값을 참조하기 때문.
    // let i 로 선언하면 스코프마다 다른 i를 생성하여 서로 다른 값을 참조하게 하여 해결.
  };
}

const

  • 초기 선언시에 무조건 값을 할당하여 선언해야 함.
  • 한번 선언된 변수는 값을 변경할 수 없음.
  • 배열이나 객체는 참조값을 갖기 때문에 값 변경가능.
  • for-in과 for-of는 반복 실행 시마다 새로운 바인딩을 만듬. 즉, for(const fruit in fruits){}는 오류가 발생되지 않음.

문자열 메서드

정규표현식 사용불가

메서드 의미
includes() 문자열의 어느 곳에서든 주어진 문자를 찾으면 true를 반환
startsWith() 문자열의 시작점에서 주어진 문자를 찾으면 true를 반환
endsWith() 문자열의 끝에서 주어진 문자를 찾으면 true를 반환
repeat() 원본 문자열을 명시한 횟수만큼 반복하여 새로운 문자열 반환

문자열 문법

  • 백틱(`)으로 멀티라인 문자열 표현.
  • 치환자 ${} : 백틱 영역안에서 변수 사용 가능.
  • 템플릿 태그
let count = 10,
  price = 0.25,
  greet = tag`${count} items cost ${price} hello`;

//인수1(test:문자열만 배열로 반환)
//인수2(...test2:변수값 나열)
function tag(test, ...test2) {
  console.log(test); //[""," items cost "," hello"]
  console.log(...test2); //10 0.25
}

함수

인수에 기본값 설정

  • 인수의 기본값으로 숫자선언가능
  • 수식가능
  • 첫번째 인수 선언가능
  • 함수 선언가능
function fn(number, compare = 11) {
  return number + compare;
}

function getValue() {
  return 5;
}

function fn2(number, compare = getValue()) {
  return number + compare;
}

console.log(fn(10, 20)); //만약 다른 값 20을 할당하면, 11무시되고 20이 됨.
  • arguments ES5 strict모드에서는 인수의 값을 변경해도 변경되지 않음. ES6에서는 모드와 상관없이 변경이 되지 않음.
function fn(number, compare = 11) {
  //기본값 설정. 수식도 가능. 첫번째 인수값 설정가능.
  console.log(arguments[0]); //10
  console.log(arguments[1]); //20
  number = 1; //값이 새롭게 할당되도 arguments에 영향을 주지 않음.
  compare = 1;
  console.log(arguments[0]); //10
  console.log(arguments[1]); //20
}

fn(10, 20); //전달된 인자 수에 따라 argruments 수가 정해짐.
fn(10); //전달된 인자 수가 1개이므로 arguments[1]은 undefined가 됨.

name 속성

function doSomething() {}
var doAnotherThing = function() {};
console.log(doSomething.name); //"doSomething"
console.log(doAnotherThing.name); //"doAnotherThing"

화살표함수

  • 함수의 축약법
  • 일반 function함수와 달리 호이스팅이 발생하지 않음.
  • 생성자가 없어, new키워드 사용할 수 없음.
  • prototype 프로퍼티가 없음.
  • 함수의 전체 생명주기 내내 this값 동일.
  • argruments객체 없음.
  • 동일한 이름의 매개변수를 사용할 수 없음.
  • 선언가능 방식
//일반적 선언방식
var eun = () => {
  return "hello";
};

//{}와 return 생략
var eun = () => "hello";

//문장이 2줄 이상이면 {}, return 생략불가
var eun = greet => {
  var name = " eunjoung";
  return greet + name;
};

//인수가 한개이면, () 생략 가능
var eun = str => str;

//인수가 없거나 2개 이상이면 () 사용해야 함.
var eun = (greet, name) => greet + name;
  • arrow함수의 this
    • arrow함수의 this는 전역선언일 경우 전역객체이며, 부모 함수의 this를 따라감.
    • this의 예
//전역함수
var fn = () => {
  console.log(this); //window
};
fn();

//생성자로 선언된 함수
function Fn() {
  console.log(this); //Fn
  var sFn = () => {
    console.log(this); //Fn
  };
  sFn();
}
var fn = new Fn();

//객체 내부에 선언된 메소드
var obj = {
  fn: () => {
    console.log(this); //windows
  }
};

obj.fn();

객체 리터럴

  • 프로퍼티 초기자 축약
var obj = {
  name: name, //이름과 값이 동일하면 축약 할수 있음.
  age: age
};

var name = "eun";
var age = 30;
var obj = {
  name, //이렇게되면 주변에 name과 age를 찾아 그 값을 할당.
  age
};
  • 간결한 메서드
var obj = {
  name: function() {
    return "eun";
  },
  name() {
    // : fuction 이 생략됨.
    return "eun";
  }
};
  • 계산된 프로퍼티 이름
var lastname = "last name";
var justname = " eunjoung park";
var obj = {
  "first name": "eunjoung", //문자열로 name을 설정
  [lastname]: "park", //상단에 선언된 "last name"을 []안에서 계산되어 사용.
  ["hello" + justname]: "hello park!!" //[]안은 계산되어 문자열+변수 조합으로 사용할 수 있음.
};
console.log(obj["first name"]);
console.log(obj[lastname]);
console.log(obj["last name"]);
console.log(obj["hello eunjoung park"]);
  • 나머지 연산자(스프레드 오퍼레이터) & 나머지 매개변수
    • 배열, 객체의 값을 열거하는 방식으로, 변수 나 인수로 표현 가능.
    • 나머지 매개변수의 경우 맨 마지막에 선언되어야 함.
    • 나머지 연산자로 배열과 객체를 전달할 시에 다른 값과 함께 사용가능.
function printName(...name, age){ //...name 뒤에 다른 매개변수를 선언할 수 없음. age로 인해 오류발생
    for(var n in name){           // 출력 :
        console.log(name[n]); // eun
                            // joung
                            // park
    }
}

printName("eun","joung","park");
  • 객체의 setter에 나머지변수를 사용할 수 없음. setter는 인수를 한 개만 받도록 설계되어있음.
  • 객체 메서드
    • Object.is() : 두 값을 비교하여 true, false로 반환.
console.log(+0 == -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN == NaN); //false
console.log(Object.is(NaN, NaN)); //true

console.log(5 == 5); //true
console.log(5 == "5"); //true

console.log(Object.is(5, 5)); //true
console.log(Object.is(5, "5")); //false
  • Object.assign() : 객체 합성
var receiver = {};
Object.assign(
  receiver,
  {
    type: "js",
    name: "file.js"
  },
  {
    type: "css"
  }
);

또는;

var receiver = Object.assign(
  {
    type: "js",
    name: "file.js"
  },
  {
    type: "css"
  }
);

console.log(receiver.type); //"css"
console.log(receiver.name); // "file.js"
  • 객체속성 열거 Object.getOwnPropertyNames(object name);

구조분해

  • 배열
var num = [1, 2, 3];
var [a, b] = num;
console.log(a, b); //1,2
var [a, ...b] = num;
console.log(b); //[2,3]
var [a = 5, b, c, d = 4] = num;
console.log(a, b, c, d); //1,2,3,4
var [a, , b] = num;
console.log(a, b); //1,3

var a = 1;
var b = 2;
[b, a] = [a, b];
console.log(b, a); //1,2

var [a, b] = [1, 2, 3];
console.log(a, b); //1,2
  • 객체 : 할당할 대상의 변수명이 객체의 속성명과 동일 해야함.
var obj = {
  name: "park",
  age: 30,
  greet() {
    console.log("hello!!!");
  }
};
var { name, age, value, height = 160 } = obj;
console.log(name, age); //park 30
console.log(value); //undefined
console.log(height); //160 - 초기값설정 가능

또는;

var name, age;
({ name, age } = obj);
console.log(name, age); //park 30

var { greet } = obj;
greet(); //hello!!!

var { greet: hello } = obj;
hello(); //hello!! - 변수명을 hello로 변경가능
//중첩된 객체 구조분해
let node = {
  type: "Identifier",
  name: "foo",
  loc: {
    start: {
      line: 1,
      column: 1
    }
  }
};

let {
  loc: { start }
} = node;
console.log(start.line); //1
console.log(start.column); //1

let {
  loc: { start: localStart }
} = node;
console.log(localStart.line); //1
console.log(localStart.column); //1

Symbol

  • 원시데이터형 (유형 : string, number, boolean, null, undefined, symbol)
  • new 생성자 키워드를 지원하지 않음.
  • 생성방법
let symbol = new Symbol();
let symbol1 = new Symbol("sym1"); //문자열로 변수을 유추할 수 있게 함. 문자열은 toString()으로 출력하는 것 외에는
// 활용되지 않음.
let symbol2 = new Symbol.for("sym1"); //symbol2를 계속 활용 가능.
  • 비공개 이름기능
let name = Symbol.("name");
let person = {
    [name] : "park",
    age : 30
}
for(item in person){
    console.log(item); //[name]속성은 색인되지 않음.
}
  • 유일무이한(항상 다른 ID) 값을 가짐.
console.log(Symbol("sym") === Symbol("sym")); //false
  • 유일한 식별자를 나타내면서 동일한 심벌 ID를 갖도록 처리도 가능함.(전역 심볼 저장소에 등록됨.)
let symbol1 = Symbol.for("sym");
let symbol2 = Symbol.for("sym");
console.log(symbol1 === symbol2); //true
  • 또다른 장점 : Symbol.for(“age”)가 person.age를 오버라이드 하지 않아, 다른 값을 액세스할 수 있음.
let symbol = Symbol.for("age");

let person = {
  name: "eun",
  age: 30
};

function makeAge(obj) {
  let anotherAge = Symbol.for("age");
  obj[anotherAge] = 27;
}
makeAge(person);
console.log(person[symbol]);
console.log(person["age"]);
  • 심벌은 타입변환이 안됨.
let symbol = Symbol("age");
console.log(symbol + "age"); //에러!
console.log(symbol + 1); //에러!
  • 심벌 프로퍼티 열거 Object.getOwnPropertySymbols(object name);

Set & Weak Set

Set

  • 배열 데이터를 저장함.
  • 중복을 제거함.
  • 키값이 없음.
  • 삽입된 값의 타일을 강제변환(문자형)하지 않음.
  • 배열처럼 인덱스 값으로 요소에 직접접근 불가.
  • 값을 출력할 때, 이터레이터 사용.
  • 메서드 종류
    • add(value) : 선택 요소 추가
    • delete(value) : 선택 요소 삭제
    • clear() : 인스턴스의 모든 값 삭제.
    • forEach(function(value,value,set){}, this) : set에 저장된 값을 순회. 두번째 인자로 this사용 가능.
    • size : 요소가 몇 개인지 반환.
let set = new Set([1, 2]);
let arr = [...set]; //배열로 변환가능.
set.forEach(function(value, value, setArray) {
  console.log(value); //값을 넘기는 인자가 두개
});

Weak Set

  • 약한 Set
  • 객체형 값만 받을 수 있음(가비지 컬렉터가 발생될 수 있는 유형에 적합).
  • 이터러블이 아니므로 for-of 사용불가
  • Weak Set안에 값 확인불가.
  • forEach, size프로퍼티 제공하지 않음.
  • 메서드 종류
    • add(value) : 선택 요소 추가
    • has(value) : 선택 요소 존재여부 반환.
    • delete(value) : 선택 요소 삭제
let key1 = {};
let weakset = new WeakSet([key1]); //배열형태로 객체값을 초기화.
console.log(weakset.has(key1)); //true

Map & Weak Map

Map

  • 키와 값이 한쌍인 컬렉션임.
  • 메서드 종류
    • set(key, value) : 값 추가
    • get(key) : 값 반환
    • has(key) : 키값 존재 여부 반환.
    • delete(key) : 키와 키의 값 제거
    • clear() : map의 내용 모두 제거
    • size : 요소가 몇 개인지 반환.
    • forEach(function(value,key,map){}, this) : map의 요소를 순회. 두번째 인자로 this사용 가능.

Weak Map

  • 약한 Map
  • 모든 키가 객체여야 함.
  • Weak Map은 DOM 요소의 객체를 만들때 적합.
  • forEach(), clear(), size프로퍼티 지원안함.
  • 메서드 종류
    • set(key, value) : 값 추가
    • get(key) : 값 반환.
    • has(key) : 키값 존재 여부 반환.
    • delete(key) : 키와 키의 값 삭제
let key1 = {};
let weakmap = new WeakMap([key1, "key1Value"]); //배열형태로 객체값을 초기화.
console.log(weakmap.get(key1)); //"key1Value"

일반 배열의 forEach

일반 배열문은 forEach(function(value, index, array){}, this)의 인수를 갖음.

이터레이터

반복을 설계하기 위한 객체

  • 메서드
    • next() : 반복가능한 값을 순회하여 {value:value, done: false or true} 객체를 반환. 마지막 값 이후에 {value:undefined, done:true}를 반환.

제네레이터

이터레이터를 반화하는 함수, return과 같이 반환해주는 yield문을 사용. 함수를 종료시키는 return과 다르게 이터레이터의 값을 하나씩 반환하고, 다음 next()문이 호출될 때까지 대기함.

function* eunjoung() {
  yield 1;
  yield 2;
  yield 3;
}
let eun = eunjoung();
console.log(eun.next()); //{value: 1, done: false}
console.log(eun.next()); //{value: 2, done: false}
console.log(eun.next()); //{value: 3, done: false}
console.log(eun.next()); //{value: undefined, done: true}

이터러블

  • Symbol.iterator 프로퍼티를 갖는 객체.
  • ES6에 Array, Set, Map, 문자열은 이터러블임.
  • 이터러블은 for-of와 함께 사용되도록 설계됨.
let values = [1, 2, 3];
let iterator = values[Symbol.iterator]();
console.log(iterator.next());
  • 이터러블 만들기
let collection = {
  items: [],
  *[Symbol.iterator]() {
    for (let item of this.items) {
      yield item;
    }
  }
};
collection.items.push(1);
collection.items.push(2);
collection.items.push(3);
for (let x of collection) {
  console.log(x);
}
//1
//2
//3

내장 이터레이터

  • entries() : 값으로 키와 값을 갖는 이터레이터 반환
  • values() : 값으로 값을 갖는 이터레이터 반환.
  • keys() : 값으로 키를 갖는 이터레이터 반환.

Class선언

  • Class문 안에 메서드는 prototype임.
  • Class문 안에 생성자를 정의 함으로 해서 typeof가 function임.
  • Class는 호이스팅되지 않음.
  • Class내부는 자동으로 strict모드 임.
  • Class의 모든 메서드는 열거불가.
  • Class는 new키워드로 정의하여야 함.
  • Class 내부에서 Class이름을 덮어쓸 수 없지만, 외부에서는 가능.
  • Class의 메서드나 접근자 프로퍼티 앞에 static이라 명시하여 정적 멤버를 만들수 있음.

Class선언 방법

class Person {
  constructor(name) {
    this.name = name;
  }
  getName() {
    //축약법을 사용, 프로토타입메서드
  }
}

또는;

let Person = class {
  constructor(name) {
    this.name = name;
  }
  getName() {}
};

일급 시민 클래스

  • 함수에 전달되고
  • 함수로부터 반환되고
  • 변수에 할당될 수 있는 값을 일급 시민이라고 함.
//선언시 바로 인스턴스에 반환.
let person = new (class {
  constructor(name) {
    this.name = name;
  }

  sayName() {
    console.log(this.name);
  }
})("Nicholas");

person.sayName(); //"Nicholas"

파생클래스

  • 파생클래스에서 constructor를 명시하려면 반드시 super()를 사용해야함.
  • 파생클래스에서만 super를 사용할 수 있음.
  • 생성자안에서 this를 접근하기 전에 super를 먼저 호출해야 함.
  • super를 호출하지 않는 유일한 방법은 생성자에서 객체를 반환하는 것.
  • 기반 클래스의 정적 멤버도 상속됨.
  • 일반 함수선언식도 상속할 수 있음.
function Animal(move) {
  this.move = move;
}

class Person {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log(this.name);
  }
}

class Human extends Person {
  constructor(name, age) {
    super(name);
    this.age = age;
  }
}

class cat extends Animal {
  constructor(move) {
    super(move);
  }
}

배열

  • Array.of() : new Array(2) 와 같이 한 개의 숫자 인수로 생성자를 호출하면, 이것은 요소가 되지 못하고 배열의 길이가 됨. 이 문제를 해결하기 위해 Array.of(2) 로 해결할 수 있고 예측가능 한 연산을 수행함.
  • Array.from() : 유사배열을(객체)를 배열처리 사용하고자 할때 사용.
//일반적인 사용법
let el = document.querySelectorAll("button");
let elArr = Array.from(el);

//매핑변환 가능.
let el = document.querySelectorAll("button");
Array.from(el, val => (val.textContent = "버튼"));
  • find() : 특정조건에 맞는 첫번째 값을 반환
  • findIndex() : 특정조건에 맞는 첫번째 요소의 위치 반환
let numbers = [25, 30, 35, 40, 45];
console.log(numbers.find(n => n > 33)); //35
console.log(numbers.findIndex(n => n > 33)); //2
  • fill(변경할 값, 시작인덱스, 끝인덱스) : 배열을 특정값으로 한번에 변환. 시작과 끝인덱스 사용은 선택.
  • copyWithin(복사를 시작할 위치, 복사대상의 시작점, 복사대상의 끝점) : 특정위치에 값을 연속적으로 복사

*es6 지원상황 : https://kangax.github.io/compat-table/es6/_

[참조] 추가내용

댓글남기기