[리액트 공부하기] #3

Array.prototype.slice.call(arguments) 표현 설명
이 표현은 JavaScript에서 함수의 arguments 객체를 실제 배열로 변환하는 고전적인 패턴이다.
프로토타입, 메서드 호출, this 바인딩, 클래스/ 생성자 함수 개념을 바타응로 단계적으로 이해할 수 있다.
arguments 객체: 함수 내부에서 사용 가능한 특수 객체로, 함수에 전달된 모든 인수를 포함한다. 
하지만 배열이 아니다. 유사 배열(array-like) 객체로, 길이(length)오 인덱스 접근(arguments[0])은 배열처럼 동작하지만, 배열 메서드(map, forEach 등)를 직접 사용할 수 없다.

Array.prototype.slice: Array 클래스의 프로토타입 메서드로, 배열의 일부를 복사해 새 배열을 반환한다.
Person.prototype.sayHi처럼 Array.prototype에 정의된 메서드이다.

slice는 인수 없이 호출하면 전체 배열을 복사한다.

.call() 메서드: 모든 함수 객체(메서드 포함)가 가진 메서드로, 함수를 다른 객체의 컨텍스트에서 호출한다. this를 원하는 객체로 바인딩 할 수 있다. .call()는 메서드의 this를 변경한다.

Array.prototype.slice 메서드를 arguments 객체의 컨텍스트(this)로 호출한다.
slice가 this를 arguments로 보고 그 "배열"의 전체 요소를 복사해 새로운 배열을 반환한다.

function sumAll() {
    // arguments는 {0: 1, 1: 2, 2: 3, length: 3} 같은 유사 배열
    console.log(arguments); // [Arguments] { '0': 1, '1': 2, '2': 3, length: 3 }
    
    // Array.prototype.slice.call(arguments)로 배열 변환
    const argsArray = Array.prototype.slice.call(arguments);
    console.log(argsArray); // [1, 2, 3] (진짜 배열)
    
    // 이제 배열 메서드 사용 가능 (reduce로 합 계산)
    const sum = argsArray.reduce((acc, num) => acc + num, 0);
    return sum;
}

console.log(sumAll(1, 2, 3)); // 6