Array.prototype.slice.call(arguments) 에 대하여

2017. 6. 25. 21:25Dev/javascript

반응형

http://www.jaeminjo.com/post/107109578789/arrayprototypeslicecallarguments


위의 링크에 친절한 설명이 나와 있지만 부가 설명을 해본다.


이것을 이해하기 위해서는 call(), arguments를 이해해야 한다.


call()은 상위 context를 변경하는 메서드이고

arguments는 함수의 매개변수에 접근할 수 있는 속성이다.


먼저 위의 행위를 말로 설명하자면 

이 코드가 존재하는 함수의 매개변수로 넘어온 값들을 array로 변환하겠다는 것이다.

function func(a, b){} 에서 a와 b를 arguments[0]과 arguments[1]로 접근가능하다.

하지만 여기서 arguments는 array가 아니며 object임을 알아야 한다.(참고) 그러므로 array로 변환할 필요가 있을 경우 Array.prototype.slice.call(arguments) 를 사용하는 것이다.


이 코드는 보통 아래와 같이 apply와 함께 사용된다.

var args = Array.prototype.slice.call(arguments);

func.apply(this, args); 

apply는 call과 같이 상위 context를 변경해준다. 차이점은 매개변수를 넘겨주는 2번째 인자가 Array라는 점이다. Array에 담긴 순서에 맞게 호출된 함수(func)의 매개변수에 적용된다.


Array.prototype.slice.call(arguments);

이 코드는 결과만 보면 아래와 같다.

[arguments].slice();

call()의 첫번째 인자에 arguments가 전달되므로 Array의 context는 arguments로 대체되기 때문이다.


추가로 ES6에서는 Array.from()으로 제공한다(참고)


결론

결국 이러한 행위는 문법적 꼼수라고 할 수 있다.

v8엔진에서 최적화 문제도 있다고 하니 다음 코드를 사용해보는 것도 좋다.

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));


반응형

'Dev > javascript' 카테고리의 다른 글

자바스크립트 성능과 사용자 경험 개선  (0) 2017.07.16
브라우저의 단일스레드와 repaint, reflow  (0) 2017.07.16
패턴  (0) 2017.06.04
자바스크립트 객체  (0) 2017.01.19
자바스크립트 도구 다루기  (0) 2017.01.19