[마스터 개념] 4 | 이터러블
1 variable 변수
2 operator 연산자
3 function 함수
4 object 객체
5 class 클래스
7 built-in 빌트인 객체
8 array 배열
9> iterator 이터러블
10 map
11 more-operators 유용한 연산자들
12 module 모듈
13 promise 프로미스
14 scope 스코프
15 prototype 프로토타입
16 closure 클로져
17 this
9 iterator 이터러블
[Symbol.iterator]( ) : Iterator{ next( ) : {value, done}};
Iterable 은 순회가 가능하다. Iterable 은 객체가 [Symbol.iterator]( )를 가지고 있어야 하며, 호출했을 때 Iterator 를 반환해야 한다. 그 Iterator 안에는 value 와 done 값을 반환하는 next( ) 함수가 반환되어야 한다.
Itarable 을 따르는 객체인 Array, String, Map, Set 과, 심볼 정의를 가진 객체, Iterator 를 리턴하는 특정 함수는 순회가 가능한 객체이므로 for .. of, spread 연산자를 사용할 수 있다.
const array = [1, 2, 3];
for (const item of array.values()) {
console.log(item); // 1
// 2
// 3
}
const obj = { 0: 1, 1: 2 };
for (const item in obj) {
console.log(item); // 0
// 1
}
for .. in : for .. of 객체를 사용할 수 없는 일반 객체일 때, key 값을 출력
// next() 를 수동으로 출력
const iterator = array.values();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3
// done : true -> 반복이 끝남
onsole.log(iterator.next().done); // true
// for .. of, for .. in 가 없다면,
while (true) {
const item = iterator.next();
if (item.done) break;
console.log(item.value); // 1
// 2
// 3
}
// 0부터 10미만 숫자의 2배값을 순회하는, 이터레이터(반복자) 만들기
// input : 0, 1, 2, 3, ... , 9
// output : 0, 2, 4, 6, ... , 18
const multiple = {
[Symbol.iterator]() {
const max = 10;
let num = 0;
return {
next() {
return { value: num++ * 2, done: num > max };
},
};
},
};
for (const number of multiple) {
console.log(number); // 0
// 2
// 4
// ...
// 18
}
// 재사용 가능하게 함수로 재구성 하기
// 0부터 10미만 숫자의 2배값을 순회하는, 이터레이터(반복자) 만들기
// input : 0, 1, 2, 3, ... , 9
// output : 0, 2, 4, 6, ... , 18
function makeIterable(initialValue, maxValue, callback) {
return {
[Symbol.iterator]() {
let num = initialValue;
return {
next() {
return { value: callback(num++), done: num > maxValue };
},
};
},
};
}
const multiple = makeIterable(0, 10, (num) => num * 2);
for (const number of multiple) {
console.log(number); // 0
// 2
// 4
// ...
// 18
}
Spread
전개구문, 순회가 가능한 모든 것을 펼칠 수 있다. 따라서 모든 Iterable은 Spread 될 수 있다.
function add(a, b, c) {
return a + b + c;
}
const nums = [1, 2, 3];
console.log(add(...nums)); // 6
// Rest Parameters
function sum(first, second, ...nums) {
console.log(nums); // [ 0, 1, 2, 4 ]
}
sum(1, 2, 0, 1, 2, 4);
const fruits1 = ["사과", "키위"];
const fruits2 = ["딸기", "바나나"];
// Array Concat
let arr = [...fruits1, "복숭아", ...fruits2];
console.log(arr); // [ '사과', '키위', '복숭아', '딸기', '바나나' ]
const person = { name: "mallang", age: 20, home: { address: "home" } };
const updated = {
...person,
job: "s/w engineer",
};
console.log(person); // {
// name: "mallang",
// age: 20,
// home: { address: "home" },
// job: 's/w engineer'
// }
이때 Object 는 얕은 복사가 일어나며 기존의 것을 변경하지 않는다.
Destructure 구조 분해 할당
데이터의 그룹화를 쉽게 만들 수 있다.
const fruits = ["사과", "키위", "딸기", "바나나"];
const [first, second, ...others] = fruits;
console.log(first); // 사과
console.log(second); // 키위
console.log(others); // [ '딸기', '바나나' ]
const point = [1, 2, 8];
const [x, y, z = 0] = point;
console.log(x); // 1
console.log(y); // 2
console.log(z); // 8
지정된 값이 없는 경우, 초기값을 지정해 줄 수 있지만 지정된 값이 있다면 초기값보다 그 값이 우선순위가 높으므로 지정된 값이 출력된다.
function createKorean() {
return ["apple", "사과"];
}
const [title, korean] = createKorean();
console.log(title); // apple
console.log(korean); // 사과
const mallang = { name: "mallang", age: 20, job: "s/w engineer" };
const { name, age, job: occupation, pet = "거북이" } = yeHyun;
console.log(name); // mallang
console.log(age); // 20
console.log(occupation); // s/w engineer
console.log(pet); // 거북이
job 이라는 키가 occupation 이라는 키로 변환되었고, pet 처럼 키와 값을 추가할 수 있다.
'💠프로그래밍 언어 > JavaScript' 카테고리의 다른 글
[마스터 개념] 6 | 모듈 (0) | 2022.11.07 |
---|---|
[마스터 개념] 5 | map, 유용한 연산자들 (0) | 2022.11.01 |
[마스터 개념] 3 | 배열 (0) | 2022.10.31 |
[마스터 개념] 2 | 객체, 클래스, 빌트인 객체 (0) | 2022.10.26 |
[마스터 개념] 1 | 변수, 연산자, 함수 (0) | 2022.10.25 |