이래서 조작이 위험합니다. 특히 함수에서 사용할 때 위험하지요. 함수에 전달하는 정보가 근본적으로 달라지는 것을 예측할 수 없기 때문입니다. 위의 경우에는 books
를 const
로 할당하기도 했습니다. 따라서 조작되지 않을 것이라고 생각할 수도 있지만, 항상 그렇지는 않습니다.
splice()
메서드가 for
문의 괜찮은 대안처럼 보이겠지만, 조작은 너무나 많은 혼란을 가져오므로 가능하면 피하는 것이 좋습니다.
끝으로 방법이 하나 더 있습니다. 배열에는 slice()
라는 메서드가 있습니다. slice()
메서드는 원본 배열을 변경하지 않고 배열의 일부를 반환합니다. slice()
메서드에 인수로 시작점과 종료점을 전달하면 그 사이에 있는 모든 항목을 반환합니다. 또는 종료점을 생략하고 시작점만 인수로 전달하면 시작점부터 배열의 마지막 항목까지 반환합니다. 그 후에 concat()
을 이용해서 배열 조각을 다시 연결할 수 있습니다.
arrays/spread/slice.js
function removeItem(items, removable) { const index = items.indexOf(removable); return items.slice(0, index).concat(items.slice(index + 1)); }
이 코드는 꽤 훌륭합니다. 원본 배열을 변경하지 않고 새로운 배열을 생성했으며 코드도 많지 않습니다. 그렇지만 무엇이 반환되는지 정확하지 않습니다. 다른 개발자가 이 코드를 본다면, concat()
으로 배열 두 개를 병합해서 배열 하나를 생성한다는 사실을 이해해야 합니다. 무슨 일이 일어나는지를 눈으로만 봐서는 정확히 어떤 작업을 하는 코드인지 알기 어렵습니다.