728x90
서론
배열과 관련된 문제를 풀 때마다 slice()함수가 정말 많이 유용하게 사용되고 있음에도 불구하고, 쓸 때마다 자꾸 헷갈리는 부분이 있어서 그걸 제대로 잡고자 쓰는 글이다.
본론
slice() 함수
- 생김새 : arr.slice(begin, end) (end는 생략 가능)
- 배열의 begin index부터 (end-1) index 까지 반환해주는 함수이다.
- 매개변수로 index의 범위가 넘어가는 수가 들어가면 빈 배열을 반환한다.
- 원본 배열을 훼손하지 않는 것이 splice()와 가장 큰 차이점이다.
- 즉, 새로운 배열로 반환해주는 것이다.
- 개인적으로 slice() 함수에서 헷갈리는 부분이 두 가지가 있었다.
- end index가 생략될 수도 있다는 점과, end index는 실제로 (end-1) index까지 적용된다는 점이다. end index가 생략된 경우에는 자동으로 해당 배열의 마지막 값까지 자른다는 의미이다.
- 매개변수로 음수값이 들어갈 수도 있다. 예를 들어, -1은 해당 배열의 가장 마지막 값, -2는 해당 배열의 가장 마지막 값에서 두번째 값 ... 이런식으로 배열의 마지막을 기준으로 1, 2, 3... index로 생각하면 된다. 근데 이게 음수는 좀 예외적으로 이해해야 할 부분이 있다.
- 다양한 예시를 들어서 이해해보자!
/* slice함수 연습 */ let sliceTest = [1, 2, 3]; console.log(sliceTest.slice(0)); // [1, 2, 3] console.log(sliceTest.slice(0, 0)); // [] console.log(sliceTest.slice(0, 1)); // [1] console.log(sliceTest.slice(-1)); // [3] console.log(sliceTest.slice(0, -1)); // [1, 2] console.log(sliceTest.slice(0, -2)); // [1] console.log(sliceTest.slice(0, -3)); // [] console.log(sliceTest.slice(-1, 1)); // [] console.log(sliceTest.slice(-3, -1)); // [1, 2]
- slice() 배열로 활용될 수 있는 다양한 예시들이다. 맨 처음 예시처럼 0만 매개변수로 들어간 경우에는 start = 0 index라는 의미이고, end가 없으니 시작 index인 1부터 자동으로 배열의 끝인 3까지 반환해주는 것이다.
- 그리고 가장 헷갈렸던 음수값이 들어갔을 때는 다음과 같이 이해하면 쉽다.
[ 1, 2, 3 ] 0 1 2 << index -3 -2 -1 << index
- slice() 함수에서 배열 [1, 2, 3]은 위와 같은 index를 갖게 된다. (실제로 음수 index를 가지는 것은 아니고, 이해를 위해 index라고 표현했다)
- 이 배열에서 slice(0, -1)을 하면 [1, 2]를 반환하게 된다. 이는 index의 위치를 보면 slice(0, 2)과 비슷하니까 이해가 쉬웠다. 그런데 slice(-1, 1)은 뭔가 [3]이 반환될 것 같았는데 보다시피 [] 빈배열이 반환된다. 왜 그런지 생각해봤더니 slice함수의 매개변수는 내가 적어놓은 index의 오른쪽 방향으로 가는 경우에만 적용이된다는 사실을 알아냈다.
- 무슨 의미냐면 (0, 1) or (-3, -1) or (1, -1) or (0, -2)와 같이 start index가 end index보다 더 왼쪽에 위치한 경우에는 적용이 되지만, (2, 1) or (1, 0) or (2, 0) or (-1, -3) or (-1, 0) 과 같이 start index가 end index보다 더 오른쪽에 위치한 경우에는 빈 배열이 반환된다.
- 이 사실을 알고 나니 slice 함수의 매개변수로 어떤 값이 들어가도 이제 헷갈리지 않았다. 이제 이해한 걸 바탕으로 문제 풀 때 잘 적용만 시키면 될 것 같다!
'Web FrontEnd > JavaScript' 카테고리의 다른 글
[문법] filter() , map() , reduce () 함수 / JavaScript (0) | 2022.01.11 |
---|---|
[문법] forEach VS for ... in VS for ... of 반복문 / JavaScript (0) | 2022.01.11 |