sort() method 는 함수의 parameter로 들어온 arguments의 값도 변경합니다

kdy·2023년 5월 10일
0
function solution(emergency) {
    var answer = [];
    let soted=emergency.slice().sort((a,b)=> b-a);
    
        for(let i=0;i<soted.length;i++)
            {
                 let index = emergency.indexOf(soted[i]);
                        answer[index] = i + 1;   
            }
    return answer;
}

알고리즘 문제 풀다가 놀랐는대

sort 함수를 쓰게되면 스코프가 함수안으로 잡혀도 해당 함수의 parameter값을 변경할수있습니다. [배열일때만]

사실 공식문서를 잘 읽어보면 놀라지 않았을지도 모릅니다.

function solution(emergency) {
    let soted=emergency.sort((a,b)=> b-a);
    .....
    						}

soted를 선언 해주었지만 이때 emergency라는 같은 스코프 내에 있지만 함수의 인자값인 emergency의 순서를 바꿔버립니다.

그래서 만약 sort를 쓰게된다면 slice나 map을 사용하든 완전 다른 변수에 보관해서 사용하든 원본을 지키려는 생각을 해야합니다.

emergency.sort((a,b)=> b-a);

=> 

emergency.slice().sort((a,b)=> b-a);

MDN sort()

js arguments
JS를 1년 반 가까이 했지만 알고리즘을 잘 안해서 이제서야 알게된 사실입니다.

함수의 params가 함수 실행도중 변경된다는 사실을 이제 처음 알았습니다.

아무리 같은 스코프라지만 params는 read only인줄알았습니다.

chatGpt 선생님의 답변

파라미터로 전달된 배열 arguments는 일반적으로 읽기 전용이며 수정할 수 없습니다. 그러나, sort() 함수를 포함하여 일부 배열 메서드는 원래 배열을 변경하기 때문에, arguments 배열을 변경할 수 있습니다.
이러한 경우를 방지하기 위해서는 arguments 배열을 복사하여 새로운 배열을 생성하고 해당 배열에서 작업해야 합니다. 또는 const나 Object.freeze() 등을 사용하여 배열을 읽기 전용으로 만들 수도 있습니다.

profile
빠르고 정확해야 혈압이 안오른다

0개의 댓글