Set
중복없이 유일한 값을 저장하기 위한 타입, 이미 존재하는지 체크할때 유용하다
let mySet = new Set();
console.log(toString.call(mySet)); // [object Set]
function print(set){
set.forEach(function(value){
console.log(value);
});
}
mySet.add('a');
mySet.add('b');
mySet.add('a'); //저장 안됨
print(mySet); // "a" "b"
console.log(mySet.has('b')); // true
mySet.delete('a');
print(mySet); // "b"
WeakSet
참조를 가지고 있는 객체만 저장이 가능하다.
참조를 가지고 있던 객체가 참조를 잃게 되면 (null 이 되거나…) 가비지컬렉션의 대상이 된다.
객체를 중복없이 저장하고 활용하려할때 유용하게 쓰일 수 있다.
let ws = new WeakSet();
console.log(toString.call(ws)); // [object WeakSet]
let arr = [1,2,3,4,5];
let obj = { arr };
let number = 100;
function foo(){}
//ws.add(100);
ws.add(arr);
ws.add([1,2,3,4,5]);
ws.add(obj);
//ws.add(100);
//ws.add(number);
//ws.add('string')
ws.add(foo);
ws.add(function a(){});
// 위 주석처리는 모두 에러 발생한 것들
// TypeError: Invalid value used in weak set
arr = null;
console.log(ws.has(arr)); //false
map / WeakMap
map과 set의 차이는 다루는 타입과, 구조가 다르다.
map => object , key/value set => array
이러한 차이점 이외에는 사용법은 거의 동일하다, Weak와 같은 경우에도 참조가 사라지면 가비지컬렉션의 대상이 되는 것도 동일하다.
map을 활용하여 따로 부가적인 정보를 저장하는 key/value를 활용할 수 있는 것 정도의 차이점이 있다.
WeakMap 활용
프라이빗한 변수 만들기.
const wm = new WeakMap();
function MyInfo(name, age){
wm.set(this, {name, age});
}
MyInfo.prototype.getInfo = function(){
const {name, age} = wm.get(this);
return 'name:'+name+"/age:"+age;
}
let myInfo = new MyInfo('baik', 27);
console.log(myInfo.getInfo());
//"name:baik/age:27"
console.log(wm.has(myInfo)); //true
myInfo = null;
console.log(wm.has(myInfo)); //false
//myInfo를 통해서는 name, age 값을 뽑아낼 수 없다, (private)