유사배열(Array-like)이란?
배열처럼 index를 통해 접근 가능한 것을 유사배열이라고 한다.
arguments?
자바스크립트에서는 인자를 포함해 함수를 호출할 때 암묵적으로 arguments가 생성된다.
정확히 말하자면 arguments 객체이다. arguments 객체는 함수를 호출할 때 넣었던 인자들이 배열 형태로 저장되어 있다.
하지만, 배열과 다르게 유사배열이 때문에 배열 메소드를 사용할 수 없다. (length, index를 통한 접근은 가능)
function arrayLike(a, b) {
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
arrayLike(3, 4, 5, 6) // 3 ~ 6 까지 차례대로 출력된다.
만약에 배열 메소드를 사용한다면 어떻게 될까?
위와 같이 TypeError가 발생한다.
그런데 가끔 코딩을 하다가 arguments 객체를 유사배열이 아닌 배열로 이용해야 할 경우가 생긴다.
물론 빈 배열을 만들고 for문을 돌려 push를 하면 만들 수 있긴 하지만 한 줄로 끝낼 수 있는 좋은(?) 구문이 있다.
바로 Array.prototype.slice.call(arguments)이다.
이 부분을 이해하려면 call()과 apply()의 개념 이해가 필요하다.(업로드 예정)
function foo(a, b) { var arg = Array.prototype.slice.call(arguments); arg.forEach(function(el, index, array) { array[index] += 100; }); console.log(arg); }
foo(1, 2) // [101, 102]
위와 같이 변수 arg는 꼼수(?)를 통해 arguments를 배열로 만들었기 때문에 배열 메소드 forEach를 사용할 수 있다.
p.s. 잘못된 내용이 있다면 댓글 남겨주시면 감사드리겠습니다.
'Programming > Javascript' 카테고리의 다른 글
[Javascript] this 이것은 무엇인가 (0) | 2019.02.25 |
---|---|
[Javascript] hoisting & scope 호이스팅과 스코프 (ES5, ES6 비교) (0) | 2019.02.25 |
[Javascript] insertAdjacentElement 함수에 대해 알아보자 (0) | 2019.02.20 |
[Javascript] Rest 파라미터 (0) | 2019.02.18 |
[Javascript] 유용한 배열 메서드 6가지(forEach, map, some, every, filter, reduce) (0) | 2019.02.18 |