2012-07-19 2 views
2

slice 메서드를 사용하고자하는 Uint8Array이 있습니다. 인수를 전달하고 함수에 적용하는 방법은 무엇입니까?

그래서 나는이 같은 배열 슬라이스 방법을 이용했다 :
Array.prototype.slice.call(array, start, end); 

지금 나는이 같은 몇 가지 일반적인 사용 기능을 아웃소싱하고 싶다.
나는

var utils = { 
    slice: function() { 
    return Array.prototype.slice.apply(this, arguments); 
    } 
}; 

와 그것을 시도하지만 분명히 나는 ​​정말 어떻게 작동하는지 오해. 아무에게도이 사실을 설명 할 수 있습니까?

+1

'utils.slice.call (array, start, end)'. –

+0

@Rocket 나는 내 마지막 코멘트를 금식했다. 실제로 이것은 좋은 해결책이기도하지만, 그것을 메소드 콜렉션으로 유지하고'.call'로 호출하는 것은 혼란 스럽다. 하지만 고마워, 나를 많이 자바 스크립트를 이해하는 데 도움이! –

답변

3

귀하의 문제는 this은 귀하가 생각하는 바가 아닙니다. utils.slice(foo, 1, 2)으로 전화하면 thisutils이됩니다.

당신이 그것을 호출하는 방법에 따라, 당신은 당신이 첫 번째 인수로 조작하려는 개체를 전달할 수있다, 당신은 할 것 :

var utils = { 
    slice: function() { 
    // The object we're operating on 
    var self = arguments[0]; 
    // The rest of the arguments 
    var args = Array.prototype.slice.call(arguments, 1); 

    return Array.prototype.slice.apply(self, args); 
    } 
}; 

사용법 :

var someSlice = utils.slice(someArray, 2, 14); 

또 다른 (아마도 더 명확한) 옵션은 단지 명명 된 인수를 사용하는 것입니다 :

var utils = { 
    slice: function(array, from, to) { 
     return Array.prototype.slice.call(array, from, to); 
    } 
}; 

이것은 같은 방식으로 작동합니다.

업데이트 :Uint8Arrayslice이없는 이유가 궁금있어, 내가 약 subarray 발견 :

참고

Int8Array subarray(
    long begin, 
    optional long end 
); 

하는 것으로이 만들고 있다는 사실을 숙지를 기존의 버퍼의 새로운 뷰. 새 객체의 내용을 변경하면 원래 객체에 영향을 주며 그 반대의 경우도 마찬가지입니다.

이것이 원하는 경우 일 수 있습니다. 데이터를 복사 할 필요가 없다면 더 효율적이라고 내기하고 있습니다.

+0

아, 이제 문제를 이해합니다! 설명 주셔서 감사합니다 :) –

+1

@ DanLee : 도와 줘서 기뻐요! '서브 어레이 (subarray) '에 대한 나의 노트를보고 싶을지도 모른다. –

+0

@Linus_G_Thiel : 장엄한! 왜 내가 너만큼 호기심이 아닌가? 귀하의 의견에 많은 감사를드립니다. 이제 나는 더 깊게 파헤쳐 보겠다. –

관련 문제