Set 오브젝트 -ECMAScript
Set 오브젝트는 Map 오브젝트와 비슷하지만 [key, value]가 아닌 [value]만 작성하는 점이 다릅니다. Map 오브젝트에 Array 기능을 추가한 오브젝트 입니다.
- Set 오브젝트
개요
Set 오브젝트는 Array 오브젝트와 비슷하지만, Array 오브젝트에 없는 특성이 있습니다.Set 오브젝트는 [value1, value2, ···]와 같이 값을 배열로 작성합니다.Set 오브젝트에 추가한 순서로 인덱스를 부여하여 저장합니다. 따라서 추가한 순서대로 읽히는 것을 보장해 줍니다.
Set 오브젝트는 key 개념을 갖고 있으며 value1, value2가 값이면서 키 역활도 합니다.
역활을 하는 것이지 key가 별도로 존재하는 것은 아닙니다.
이런 특징으로 인해 value 값이 같으면 나중에 추가한 값이 추가되지 않습니다.
이 점이 Array 오브젝트와 다르며 Map 오브젝트와 같습니다.
[value1, value2]에 string, number, symbol 등의 원시값(프리미티브) 데이터 타입을 작성할 수 있으며, Object, Function과 같은 오브젝트도 작성할 수 있습니다. null 값은 undefined로 취급됩니다.
Array 오브젝트에서 엘리먼트를 삭제하려면 배열을 반복하면서 값의 일치 여부를 비교해야 합니다.
같은 값이 여러 개 있을 수 있으므로 모두 삭제하려면 계속해서 비교하며 삭제가 진행됩니다.
반면 Set 오브젝트는 value 값이 같은 것이 없으므로 삭제를 한 번만 실행하면 됩니다.
new Set(): Set 인스턴스 생성
Set 인스턴스를 생성하여 반환합니다.
new Set()
- 선택적 파라미터
파라미터는 선택으로 이터러블 오브젝트를 작성하고, 그 안에 value를 0개 이상 작성합니다.
1 | const setObj = new Set(); |
Set( )파라미터에value를 지정하지 않고 인스턴스를 생성할 수 있습니다. 추후에Set오브젝트의 메서드를 이용해서value를 추가해줄 수 있습니다.
Set( )파라미터에 이터러블 오브젝트를 작성하고, 그 안에value를 작성한 형태입니다.Set인스턴스에 저장할 때 파라미터 값이key역활을 하면서value로 저장됩니다.Set인스턴스에서value의 존재 여부를 체크하고 존재하지 않으면 추가, 존재하면 추가하지 않습니다.
size프로퍼티는Set인스턴스의value수를 반환합니다.Set()파라미터에 5개의 값을 작성했는데, 실행 결과 3이 출력됩니다. 이는 같은 파라미터값은 뒤에 작성한 값이 추가되지 않기 때문입니다.
for-of문으로newSet인스턴스를 반복할 수 있습니다.newSet인스턴스의value가for-of문의element에 설정됩니다.
add(): value 추가
Set 인스턴스 끝에 value 값을 추가합니다.
Set.prototype.add()
파라미터에 Set 인스턴스에 추가할 String, 오브젝트 등의 value를 지정합니다. 값을 추가 한 후 Set 인스턴스를 반환합니다. 따라서 메서드 체인 방법으로 Set 인스턴스의 메서드를 호출할 수 있습니다.
1 | 1. const newSet = new Set(); |
Set인스턴스를 생성하여newSet에 할당합니다.add()파라미터에“축구”를 지정하여 실행하면,Set인스턴스에“축구”가 추가되며 인덱스 값은0입니다.add()를 실행한 후newSet인스턴스를 반환하므로add()를 연결하여 호출할 수 있습니다.“농구”가 추가되고 인덱스 값은1입니다.
add()파라미터에 지정한“축구”가Set인스턴스에 존재하므로“축구”가 추가되지 않습니다.
for-of문으로newSet인스턴스를 반복하면,newSet인스턴스의value가for-of문의element에 설정됩니다.newSet인스턴스에 추가된 순서대로 전개됩니다.
has(): value 존재 여부
``Set인스턴스에서value의 존재 여부를 반환합니다.
Set.prototype.has()
파라미터에 존재 여부를 체크할 값을 지정합니다. Set 인스턴스에 값이 존재하면 true, 아니면 false를 반환합니다.
1 | const newSet = new Set(); |
Set인스턴스를 생성하여newSet변수에 할당했습니다.add()를 실행하면 파라미터에 지정한“sports”가newSet인스턴스에 추가됩니다.newSet인스턴스에has()파라미터에 지정한“sports”가 존재합니다.true를 반환합니다.
entries(): 이터레이터 오브젝트 생성
이터레이터 오브젝트를 생성하여 반환합니다.
Set.prototype.entries()
생성한 이터레이터 오브젝트의 next()를 호출하면 Set 인스턴스에 작성된 순서로 [key, value]를 반환합니다.
Set 인스턴스에 key를 저장하지 않지만 value를 key에 설정하여 반환합니다.
1 | 1. const newSet = new Set(["one", () => {}]); |
- 두 개의
value를 가진Set인스턴스를 생성합니다. 하나는“one”이고 또 하나는function(){}입니다.entries()를 호출하면 이터레이터 오브젝트를 생성하여 반환합니다.
- 첫 번째
value인“one”을 반환하며 실행 결과에{value: Array[2], done: false}가 출력됩니다.value를 반환하므로{value: “one”, done: false}형태로 반환되어야 하지만,value를key에 설정하여 반환하므로{value: Array[2]}형태가 됩니다.Array[2]를 펼치면0:”one”, 1:”one”이 표시됩니다.
- 마찬가지로
value인function(){}을 반환하며{value: Array[2], done: false}형태입니다.Array[2]를 펼치면0: function(){}, 1: function(){}이 표시됩니다.
values(): value 반환 이터레이터 오브젝트 생성
value 값을 반환하는 이터레이터 오브젝트를 생성하여 반환합니다.
Set.prototype.value
생성한 이터레이터 오브젝트의 next()를 호출하면 Set 인스턴스에 작성된 순서로 value를 반환합니다.
1 | 1. const newSet = new Set(["one", () => {}]); |
- 두 개의
value를 가진Set인스턴스를 생성합니다. 하나는“one”또 하나는function(){}입니다.
인스턴스의values()를 호출하면value를 반환하는 이터레이터 오브젝트를 생성하여 반환합니다.
- 첫 번째
value인“one”이 대상이며{value: “one”, done: false}를 반환합니다.etntries()메서드가{value: Array[2]}를 반환하는 것과 차이점 입니다.
- 두 번째
value인function(){}이 대상이며{value: function(){}, done: false}를 반환합니다.
keys(): key 반환 이터레이터 오브젝트 생성
key 값을 반환하는 이터레이터 오브젝트를 생성하여 반환합니다.
Set.prototype.keys()
생성한 이터레이터 오브젝트의 next()를 호출하면 Set 인스턴스에 작성된 순서로 key 값을 반환합니다.Set 인스턴스에 value만 설정되므로 value를 key로 하여 반환합니다.
그다지 의미가 없지만 같은 이름의 Map 인스턴스 메서드와 반환 구조를 맞추기 위한 것으로 생각됩니다.
1 | const newSet = new Set(["one", () => {}]); |
- 앞의 예제들과 주어진 값은 같습니다.
keys()를 호출하면value를key로 하여 반환하는 이터레이터 오브젝트를 생성하여 반환합니다.
반환되는 프로퍼티 이름이 key가 아닌 value입니다.
forEach(): 엘리먼트마다 콜백 함수 호출
Set 인스턴스에 작성된 순서로 반복하면서 콜백 함수를 호출합니다.
Set.prototype.forEach()
- 파라미터
Function (반복할 때 마다 호출할 callback 함수)
Object (선택) callback 함수에서 this로 참조할 오브젝트
forEach()를 호출할 때마다 세 개의 파라미터를 넘겨줍니다.
첫 번째 파라미터가 value이고 두 번째 파라미터가 key입니다. 세 번째 파라미터는 실행 중인 Set 인스턴스 입니다.
value 값과 key 값이 같습니다.
1 | const newSet = new Set(["one", "two"]); |
forEach()를 처음 호출하면 콜백 함수의value와key파라미터에“one”이 설정되고obj파라미터에newSet인스턴스가 설정됩니다. 콜백 함수에서this로forEach()두 번째 파라미터에 지정한Object오브젝트를 참조합니다.
화살표 함수로 콜백 함수를 작성하면 콜백 함수 블록에서 this가 window 오브젝트를 참조하므로 이 코드와 같이 function 키워드로 작성해야 합니다.
delete(): 엘리먼트 삭제
Set 인스턴스에서 value 값이 같은 엘리먼트를 삭제합니다.
Set.prototype.delete()
파라미터
삭제할 value반환 값
삭제 성공시 true, 아니면 false 반환
1 | const newSet = new Set(["one"]); |
newSet인스턴스에서delete()파라미터에 지정한“one”과 같은value가 있으면 엘리먼트를 삭제합니다.
삭제되므로true를 반환합니다.
clear(): 모든 value 지움
Set 인스턴스의 모든 value()를 지웁니다.
Set.prototype.clear()
1 | const newSet = new Set(["one", "two"]); |
clear()를 실행하면newSet인스턴스에서 엘리먼트를 모두 지우므로size프로퍼티 값이0으로 출력됩니다.
인스턴스 자체를 지우는 것이 아니라 엘리먼트를 모두 지우는 것 이므로 다시value를 추가해줄 수 있습니다.
Symbol.iterator: 이터레이터 오브젝트 생성
이터레이터 오브젝트를 생성하여 반환합니다.
Set.prototype[Symbol.iterator]
생성한 이터레이터 오브젝트의 next()를 호출하면, Set 인스턴스에 작성된 순서로 value를 반환합니다.
1 | 1. const newSet = new Set([1, "스포츠"]); |
newSet인스턴스를 생성하고 [1, “스포츠”]를 할당합니다.newSet인스턴스의[Symbol.iterator] ()를 호출하면 이터레이터 오브젝트를 생성하여 반환합니다.
next()를 호출할 때마다newSet인스턴스의value값을{value: 1, done: false}형태의value에 설정하여 반환합니다.