You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/02-rest-parameters-spread/article.md
+75-30Lines changed: 75 additions & 30 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# 나머지 매개변수와 전개 문법
2
2
3
-
상당수의 자바스크립트 내장 함수는 인수의 갯수에 제약을 두지 않습니다.
3
+
상당수의 자바스크립트 내장 함수는 인수의 개수에 제약을 두지 않습니다.
4
4
5
5
예시:
6
6
@@ -12,7 +12,7 @@
12
12
13
13
## 나머지 매개변수 `...`
14
14
15
-
정의 방법과 상관없이 함수를 호출할 때 넘겨주는 인수의 개수엔 제약이 없습니다.
15
+
함수 정의 방법과 상관없이 함수에 넘겨주는 인수의 개수엔 제약이 없습니다.
16
16
17
17
아래와 같이 말이죠.
18
18
```js run
@@ -23,9 +23,9 @@ function sum(a, b) {
23
23
alert( sum(1, 2, 3, 4, 5) );
24
24
```
25
25
26
-
함수를 정의할 땐 인수를 두 개만 받을 수 있다고 정의했고, 실제 함수를 호출할 땐 이보다 더 많은 인수를 전달하였는데 에러가 발생하지 않습니다. 하지만 반환 값은 당연히 처음 두 개의 인수만을 이용해 계산되죠.
26
+
함수를 정의할 땐 인수를 두 개만 받도록 하고, 실제 함수를 호출할 땐 이보다 더 많은 '여분의' 인수를 전달했지만, 에러가 발생하지 않았습니다. 다만 반환 값은 처음 두 개의 인수만을 사용해 계산됩니다.
27
27
28
-
마침표 세 개 `...`뒤에 배열 이름을 적어준 후 함수 선언부의 매개변수 자리에 넣어주면 나머지 매개변수(rest parameter)를 배열에 넣어줄 수 있습니다. 마침표 세 개 `...`가 의미하는 바는 "나머지 매개변수들을 한데 모아 배열에 집어넣어라."라는 의미를 갖습니다.
28
+
이렇게 여분의 매개변수는 그 값들을 담을 배열 이름을 마침표 세 개 `...`뒤에 붙여주면 함수 선언부에 포함시킬 수 있습니다. 이때 마침표 세 개 `...`는 "나머지 매개변수들을 한데 모아 배열에 집어넣어라."는 것을 의미합니다.
29
29
30
30
아래 예시에선 모든 인수가 배열 `args`에 모입니다.
31
31
@@ -43,15 +43,15 @@ alert( sumAll(1, 2) ); // 3
43
43
alert( sumAll(1, 2, 3) ); // 6
44
44
```
45
45
46
-
앞부분의 매개변수는 변수로, 남아있는 매개변수들은 배열로 모을 수도 있습니다.
46
+
앞부분의 매개변수는 변수로, 그 이외의 매개변수들은 배열로 모을 수도 있습니다.
47
47
48
-
아래 예시에선 처음 두 인수는 변수에, 나머지 인수는`titles`이라는 배열에 할당합니다.
48
+
아래 예시에선 처음 두 인수는 변수에, 나머지 인수들은`titles`이라는 배열에 할당됩니다.
나머지 매개변수는 '남아있는' 인수를 모으는 역할을 하므로 아래 예시에선 에러가 발생합니다.
65
+
나머지 매개변수는 남아있는 인수를 모으는 역할을 하므로 아래 예시에선 에러가 발생합니다.
66
66
67
67
```js
68
68
function f(arg1, ...rest, arg2) { // ...rest 후에 arg2가 있으면 안 됩니다.
@@ -85,22 +85,22 @@ function showName() {
85
85
alert( arguments[0] );
86
86
alert( arguments[1] );
87
87
88
-
// arguments는 반복 가능한 객체입니다.
89
-
// for(let arg of arguments) alert(arg);
88
+
// arguments는 이터러블 객체이기 때문에
89
+
// for(let arg of arguments) alert(arg); 를 사용해 인수를 나열할 수 있습니다.
90
90
}
91
91
92
92
// 2, Julius, Caesar가 출력됨
93
93
showName("Julius", "Caesar");
94
94
95
95
// 1, Ilya, undefined가 출력됨(두 번째 인수는 없음)
96
-
showName("Ilya");
96
+
showName("Bora");
97
97
```
98
98
99
-
나머지 매개변수는 비교적 최신의 문법입니다. 과거엔 인수 전체를 얻어낼 수 있는 방법이 `arguments`를 사용하는 것밖에 없었습니다. 물론 지금도 여전히 `arguments`를 사용하는 게 가능합니다. 오래된 코드를 보다 보면 `arguments`를 만날 때가 있습니다.
99
+
나머지 매개변수는 비교적 최신의 문법입니다. 과거엔 함수의 인수 전체를 얻어내는 방법이 `arguments`를 사용하는 것밖에 없었습니다. 물론 지금도 `arguments`를 사용할 수 있습니다. 오래된 코드를 보다 보면 `arguments`를 만나게 되죠.
100
100
101
-
`arguments`는 유사 배열 객체이면서 이터러블(반복 가능한) 객체입니다. 어쨌든 배열은 아니죠. 따라서 배열 메서드를 사용할 수 없다는 것이 단점입니다. `arguments.map (...)` 같은 유용한 메서드를 사용할 수 없죠.
101
+
`arguments`는 유사 배열 객체이면서 이터러블(반복 가능한) 객체입니다. 어쨌든 배열은 아니죠. 따라서 배열 메서드를 사용할 수 없다는 단점이 있습니다. `arguments.map (...)`을 호출할 수 없죠.
102
102
103
-
`arguments`는 모든 인수를 담기 때문에 나머지 매개변수처럼 인수의 일부만 사용할 수 없다는 단점도 있습니다.
103
+
여기에 더하여 `arguments`는 인수 전체를 담기 때문에 나머지 매개변수처럼 인수의 일부만 사용할 수 없다는 단점도 있습니다.
104
104
105
105
따라서 배열 메서드를 사용하고 싶거나 인수 일부만 사용하고자 할 때는 나머지 매개변수를 사용하는 것이 좋습니다.
106
106
@@ -118,13 +118,13 @@ function f() {
118
118
f(1); // 1
119
119
```
120
120
121
-
화살표 함수는 `this`가 없습니다. 여기에 더하여 `arguments` 객체도 없다는 것을 위 예시를 통해 확인해 보았습니다.
121
+
앞서 배운 바와 같이 화살표 함수는 자체 `this`를 가지지 않습니다. 여기에 더하여 `arguments` 객체도 없다는 것을 위 예시를 통해 확인해 보았습니다.
122
122
````
123
123
124
124
125
125
## spread 문법 [#spread-syntax]
126
126
127
-
지금까지 매개변수 리스트를 배열로 가져오는 방법에 대해 살펴보았습니다.
127
+
지금까지 매개변수 목록을 배열로 가져오는 방법에 대해 살펴보았습니다.
128
128
129
129
그런데 개발을 하다 보면 반대되는 기능이 필요할 때가 생깁니다. 배열을 통째로 매개변수에 넘겨주는 것 같이 말이죠.
130
130
@@ -134,9 +134,9 @@ f(1); // 1
134
134
alert( Math.max(3, 5, 1) ); // 5
135
135
```
136
136
137
-
그런데 배열 `[3, 5, 1]`에 `Math.max`를 호출하고 싶은 경우가 생깁니다.
137
+
배열 `[3, 5, 1]`가 있고, 이 배열을 대상으로 `Math.max`를 호출하고 싶다고 가정해봅시다.
138
138
139
-
아무런 조작 없이 배열을 '있는 그대로' `Math.max`에 넘기면 원하는 대로 동작하지 않습니다. `Math.max`는 배열이 아닌 숫자형 인수를 받기 때문입니다.
139
+
아무런 조작 없이 배열을 '있는 그대로' `Math.max`에 넘기면 원하는 대로 동작하지 않습니다. `Math.max`는 배열이 아닌 숫자 목록을 인수로 받기 때문입니다.
140
140
141
141
```js run
142
142
let arr = [3, 5, 1];
@@ -146,18 +146,18 @@ alert( Math.max(arr) ); // NaN
146
146
*/!*
147
147
```
148
148
149
-
`Math.max (arr[0], arr[1], arr[2])` 처럼 숫자를 수동으로 나열하는 방법도 있긴 한데 배열 길이를 알 수 없을 때는 이마저도 불가능합니다. 스크립트가 돌아갈 때 배열 내 요소가 아주 많을 수도, 아예 없을 수도 있기 때문입니다. 수동으로 이걸 다 처리하다 보면 코드가 지저분해질겁니다.
149
+
`Math.max (arr[0], arr[1], arr[2])` 처럼 배열 요소를 수동으로 나열하는 방법도 있긴 한데 배열 길이를 알 수 없을 때는 이마저도 불가능합니다. 스크립트가 돌아갈 때 실제 넘어오는 배열의 길이는 아주 길 수도 있고, 아예 빈 배열일 수도 있기 때문입니다. 수동으로 이걸 다 처리하다 보면 코드가 지저분해지겠죠.
150
150
151
-
*전개 문법(spread syntax)* 은 이럴 때 사용하기 위해 만들어졌습니다. 전개 문법은 `...`를 사용하기 때문에 나머지 매개변수와 비슷해 보이지만, 나머지 매개변수와 반대의 역할을 합니다.
151
+
*전개 문법(spread syntax)* 은 이럴 때 사용하기 위해 만들어졌습니다. `...`를 사용하기 때문에 나머지 매개변수와 비슷해 보이지만, 전개 문법은 나머지 매개변수와 반대의 역할을 합니다.
152
152
153
-
함수를 호출할 때 `... arr`를 사용하면, 이터러블 객체 `arr`이 인수 리스트로 '확장'됩니다.
153
+
함수를 호출할 때 `... arr`를 사용하면, 이터러블 객체 `arr`이 인수 목록으로 '확장'됩니다.
This way of copying an object is much shorter than `let objCopy = Object.assign({}, obj);` or for an array `let arrCopy = Object.assign([], arr);` so we prefer to use it whenever we can.
0 commit comments