Set Object
- Set Object는 value 값의 컬렉션
- [value1, … valueN] 형태로 작성
- Set은 대괄호[] 가 하나
const obj = new Set([ 1, 2, "ABC" ]); console.log(`size: ${obj.size}`); // size: 3 for(let value of obj) { console.log(value); // 1, 2, ABC }
- 작성한 순서로 전개된다.
- Set은 대괄호[] 가 하나
- new Set()
- 형태: new Set()
- 파라미터: 값(option)
- 반환: 생성한 Set 인스턴스
- Set 이스턴스 생성, 반환
- 파라미터에 값을 작성
- 프리미티브, 오브젝트 타입 사용 가능
const obj = new Set([ 1, 2, 1, [], {} ]); console.log(`size: ${obj.size}`); // size: 4 for(let value of obj) { console.log(value); // 1, 2, [], {} }
- 같은 값이 있으면, 첫 번째의 1을 유지하며 세 번째의 1을 설정하지 않는다.
- same-value-zero 비교 알고리즘으로 비교, size에서는 세 번째 1이 설정되지 않으므로 값은 4가 된다.
- size 프로퍼티
- Set 인스턴스의 엘리먼트 수를 반환
- Set 오브젝트 구조
const set = Set; const obj = new Set([ "one", "two" ]);
- Set 오브젝트에 Symbol(Symbol.species)가 있다. 즉 constructor를 오버라이드 할 수 있다.
- prototype에 Symbol.iterator가 있다.
- obj를 펼치면 [[Entries]]가 있다.
- [[Entries]]를 펼치면 0: “one” 형태로 인덱스를 부여하여 key로 사용하고, “one”, “two”를 value로 설정한다.
- 인덱스를 부여하는 구조는 Map과 같으며 인덱스를 부여하여 저장하므로 작성한 순서로 읽혀진다.
- Set과 Map 비교
- 저장 형태
- Map: Key, Value로 작성, Key를 Key로 사용하여 [key, value]로 저장
- Set: Value만 작성, value를 key로 사용하여 [value]로 저장
- 값을 구하는 형태
- Map: get(key) 형태로 value를 구할 수 있다.
- Set: get() 메소드가 없다. 값 하나를 따로 구할 수 없으며 반복으로 값을 구하거나 iterator를 사용해야 한다.
- 저장 형태
Set의 메서드
- add()
- 형태: Set.prototype.add()
- 파라미터: value
- 반환: value가 설정된 인스턴스
- Set 인스턴스 끝에 value 추가
let obj = new Set(); obj.add("축구").add("농구"); obj.add("축구"); for(let value of obj) { console.log(value); // 축구, 농구 }
- 사용 형태
- 함수를 생성하여 value로 사용
let obj = new Set(); obj.add(function sports() { return 100; }); obj.add(function sports() { return 200; }); for(let value of obj) { console.log(value()); // 100, 200 }
- 같은 이름의 function을 사용했지만 참조하는 메모리 주소가 다르므로 설정된다.
- value에 생성한 함수 이름 작성
const sports = () => 100; let obj = new Set(); obj.add(sports); obj.add(sports); for(let value of obj) { console.log(value()); // 100 }
- Set에 메모리도 같은 function을 넣었기 때문에 하나만 설정된다.
- object를 value로 사용
const sports = { "축구": 11, "야구": 9 }; let obj = new Set(); obj.add(sports); for(let value of obj) { console.log(value); //{축구: 11, 야구: 9} }
- 함수를 생성하여 value로 사용
- has()
- 형태: Set.prototype.has()
- 파라미터: key값
- 반환: key가 존재하면 true / 아니면 false
- Set 인스턴스에서 값의 존재 여부를 반환
const sports = () => {} const obj = new Set([ sports ]); console.log(obj.has(sports)); // true console.log(obj.has("book")); // false
- get() 메서드가 없으므로 has()로 값의 졵 여부를 체크한 후 존재하면 체크한 값을 값으로 사용
- forEach()
- 형태: Set.prototype.forEach()
- 파라미터: callback 함수 / this로 참조할 object(option)
- 반환: undefined
- Set 인스턴스를 반복하면서 callback 함수 호출
- map(), filter() 등의 callback 함수가 동반되는 메소드 사용 불가
- callback 함수에 넘겨주는 파라미터
- value, key(value), Set 인스턴스
const obj = new Set([ "one", ()=>{} ]); function callback(value, key, set) { console.log(value); } obj.forEach(callback); // one, () => {}
- 콜백 함수에서 this 사용
const obj = new Set([ "one", "two" ]); function callback(value, key, set) { console.log(`${value}, ${this.check]`); } obj.forEach(callback, {check: "ABC"}); // one, ABC / two, ABC
- value, key(value), Set 인스턴스
- delete()
- 형태: Set.prototype.delete()
- 파라미터: key 값
- 반환: 삭제성공: true / 실패: false
- Set 인스턴스에서 파라미터 값과 같은 엘리먼트 삭제
- 같은 value가 있어 삭제에 성공하면 true 반환, 삭제에 실패하면 false 반환
const obj = new Set([ "one", "two" ]); console.log(obj.delete("one")); // true console.log(obj.delete("one")); // false
- clear()
- 형태: Set.prototype.clear()
- 파라미터: 파라미터 없음
- 반환: 없음
- Set 인스턴스의 모든 엘리먼트를 지움
- Set 인스턴스를 삭제하는 것은 아님 따라서 value를 추가할 수 있다.
const obj = new Set([ "one", "two" ]); console.log(obj.size()); // 2 obj.clear(); console.log(obj.size()); // 0 obj.add("one"); console.log(obj.size()); // 1
- Set 인스턴스를 삭제하는 것은 아님 따라서 value를 추가할 수 있다.
Set과 Iterator Object
- entries()
- 형태: Set.prototype.entries()
- 파라미터: 파라미터 없음
- 반환: 생성한 이터레이터 오브젝트 생성
- Set 인스턴스로 iterator object 생성, 반환
- Set 인스턴스에 설정된 순서로 반환, next()로 [value, value] 반환
- [value, value] 형태인 이유는 Map 오브젝트와 같은 모듈을 사용학 때문이다.
const obj = new Set([ "one", ()=>{} ]); const iterObj = obj.entries(); console.log(iterObj.next()); // {value: [one, one], done: false} console.log(iterObj.next()); // {value: [()=>{}, ()=>{}], done: false} console.log(iterObj.next()); // {value: undefined, done: ture}
- keys()
- 형태: Set.prototype.keys()
- 파라미터: 파라미터 없음
- 반환: 생성한 이터레이터 오브젝트
- value가 key가 되므로 keys()는 의미가 없다. Map Object와 맞추기 위한 것
- Set 인스턴스의 value를 key로 사용하여 이터레이터 오브젝트 생성, 반환
- Set 인스턴스에 설정된 순서로 반환
- next()로 value(key) 반환
const obj = new Set([ "one", () => {} ]); const iterObj = obj.keys(); console.log(iterObj.next()); // {value: one, done: false} console.log(iterObj.next()); // {value: ()=>{}, done: false} console.log(iterObj.next()); // {value: undefined, done: ture}
- values()
- 형태: Set.prototype.values()
- 파라미터: 파라미터 없음
- 반환: 생성한 이터레이터 오브젝트
- Set 인스턴스의 value로 이터레이터 오브젝트 생성, 반환
- Set 인스턴스에 설정된 순서로 반환
- next()로 value 반환
const obj = new Set([ "one", () => {} ]); const iterObj = obj.values(); console.log(iterObj.next()); // {value: one, done: false} console.log(iterObj.next()); // {value: ()=>{}, done: false} console.log(iterObj.next()); // {value: undefined, done: ture}
- Symbol.iterator()
- 형태: Set.prototype[Symbol.iterator]
- 파라미터: 파라미터 없음
- 반환: {done: true/false, value: 값}
- Set 인스턴스로 이터레이터 오브젝트 생성, 반환
- Set.prototype.values()와 같다.
- next()로 value 반환
const obj = new Set([ "one", () => {} ]); const iter = obj[Symbol.iterator](); console.log(iterObj.next()); // {value: one, done: false} console.log(iterObj.next()); // {value: ()=>{}, done: false} console.log(iterObj.next()); // {value: undefined, done: ture}
WeakSet Object
- Set Object와 차이
- 오브젝트만 value 값으로 사용할 수 있다.
- number 등의 프리미티브 타입 사용 불가
- 개념은 WeakMap과 같다
- value만 작성하는 것이 다르고 value의 참조가 바뀌면 GC 대상
- new WeakSet()
- 형태: new WeakSet()
- 파라미터: 오브젝트(option)
- 반환: 생성한 WeakSet 인스턴스
- WeakSet 인스턴스 생성, 반환
- 파라미터
- 대괄호[] 안에 오브젝트 작성
const empty = new WeakSet(); const sports = {}; const obj = new WeakSet([ sports ]);
- 대괄호[] 안에 오브젝트 작성
- has()
- 형태: WeakSet.prototype.has()
- 파라미터: 오브젝트
- 반환: true(존재)/false(존재X)
- WeakSet 인스턴스에 value의 존재 여부 반환
const fn = () => {} const obj = new WeakSet([ fn ]); console.log(obj.has(fn)); // true
- add()
- 형태: WeakSet.prototype.add()
- 파라미터: value, object
- 반환: value가 설정된 인스턴스
- WeakSet 인스턴스에 value 설정
- 파라미터에 value로 설정될 오브젝트 작성
const obj = new WeakSet(); const fn = () => {}; obj.add(fn); console.log(obj.has(fn)); // true
- 파라미터에 value로 설정될 오브젝트 작성
- delete()
- 형태: WeakSet.prototype.delete()
- 파라미터: key, object
- 반환: true(성공)/false(실패)
- WeakSet 인스턴스에서 value와 일치하는 엘리먼트삭제
const fn = () => {} const obj = new WeakSet([ fn ]); console.log(obj.delete(fn)); // true console.log(obj.has(fn)); // false
** 출처1. 인프런 강좌_자바스크립트 ES6+