모던 자바스크립트(javascript) 개발을 위한 ES6 강좌를 수강하면서 새롭게 알게 된 점이나 궁금했던 내용들을 적어보려고 합니다!
배열
let data = ["january", "march", "july", "december"];
let [winter,,summer] = data;
console.log(winter, summer); // january, july
객체
let obj = {
name : "jacob",
sport : "soccer",
age : "24"
}
1.
let {name, age} = obj;
console.log(name, age); // jacob 24
2. 다른 이름으로 저장을 하여 사용이 가능하다.
let {name : myName, age : myAge} = obj;
console.log(myName, myAge); // jacob 24
Set
let mySet = new Set();
mySet.add("january");
mySet.add("july");
mySet.add("january");
mySet.add("december");
mySet.forEach(function (v) {
console.log(v);
}); // january july december
mySet.has("january"); // true
mySet.has("april"); // false
mySet.size; // 3
mySet.entries(); // {['january', 'january'], ['july', 'july'], ['december', 'december']}
mySet.keys(); // {'january', 'july', 'december'}
mySet.values(); // {'january', 'july', 'december'}
mySet.delete("january");
mySet.clear();
console.log(mySet); // Set {}
※ 여기서 잠깐!! .entries()란?
Object.entries() 메서드는 for...in와 같은 순서로 주어진 객체 자체의 enumerable 속성 [key, value] 쌍의 배열을 반환한다.
WeakSet
let arr = [1, 2, 3, 4];
let myWeakSet = new WeakSet();
1.
myWeakSet.add(arr);
myWeakSet.add(1); // TypeError: Invalid value used in weak set
myWeakSet.add("1"); // TypeError: Invalid value used in weak set
myWeakSet.add(function () {});
console.log(myWeakSet); // WeakSet {f, Array(4)}
2.
let arr = [1, 2, 3, 4];
let season = ["봄", "여름", "가을", "겨울"];
let mixArr = [arr, season];
let myWeakSet = new WeakSet();
myWeakSet.add(arr);
myWeakSet.add(season);
myWeakSet.add(mixArr);
console.log(myWeakSet); // WeakSet {{…}, Array(4), Array(4)}
season = null;
console.log(myWeakSet); // WeakSet {{…}, Array(4), Array(4)}
console.log(myWeakSet.has(arr), myWeakSet.has(season)); // true false
WeakSet() 상에서는 저장을 하고 있는 것 처럼 보이지만 has를 통해 결과를 보면 똑같지 않다는 것을 알 수 있다.
※ 여기서 잠깐!! garbage collection이란?
자바스크립트는 도달 가능성
이라는 개념을 사용해 메모리 관리를 수행한다.
도달 가능성
: 어떻게든 접근하거나 사용할 수 있는 값. (더 자세한 정보!)
도달 가능한 값은 메모리에서 삭제되지 않는다.
Map
let myMap = new Map(); // key, value
myMap.set("jacob", "Lee");
myMap.get("jacob"); // Lee
myMap.has("jacob"); // true
myMap.has("Lee"); // false
myMap.size; // 1
myMap.set(function () {}, 1);
myMap.entries(); // [Map Entries] { [ 'jacob', 'Lee' ], [ [Function], 1 ] }
myMap.keys(); // [Map Iterator] { 'jacob', [Function] }
myMap.values(); // [Map Iterator] { 'Lee', 1 }
myMap.delete("jacob");
console.log(myMap); // Map { [Function] => 1 }
myMap.clear();
WeakMap
let myWeakMap = new WeakMap();
let myfunc = function(){};
myWeakMap.set(myfunc, 0);
console.log(myWeakMap); // WeakMap {ƒ => 0}
console.log(myWeakMap.get(myfunc)); // 0
myfunc = null;
console.log(myWeakMap); // WeakMap {ƒ => 0}
console.log(myWeakMap.get(myfunc)); // undefined
WeakMap 클래스 인스턴스 변수 보호하기
class gugudan {
constructor(number1, number2) {
this.number1 = number1;
this.number2 = number2;
}
mutiple() {
return this.number1 * this.number2;
}
}
let n = new gugudan(1, 9);
console.log(n.mutiple()); // 9
console.log(n.number1); // 1
number1의 값을 바로 접근할 수 있다. 만약 숨기고 싶다면 어떻게 해야 할까?
밑에 코드처럼 WeakMap을 사용하면 된다!
클래스에서 생성한 g라는 객체를 통해서는 number1, 2 값에 접근할 수 없다.
const myWeakMap = new WeakMap();
class gugudan {
constructor(number1, number2) {
myWeakMap.set(this, { number1, number2 });
}
mutiple() {
const { number1, number2 } = myWeakMap.get(this);
return number1 * number2;
}
}
let g = new gugudan(1, 9);
console.log(g.mutiple()); // 9
console.log(g.number1); // undefined
+) 추가 정보
console.log(myWeakMap.get(g)); // { number1: 1, number2: 9 }
console.log(myWeakMap.has(g)); // true
g = null;
console.log(myWeakMap.get(g)); // undefined
console.log(myWeakMap.has(g)); // false
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Keyed_collections
https://www.zerocho.com/category/ECMAScript/post/576cad515eb04d4c1aa35077
http://chanlee.github.io/2016/08/15/hello-es6-part-3/
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/entries