2014-02-27 3 views
1

pop 함수를 처음부터 작성하고 싶다면 가장 효율적인 방법은 무엇입니까? 주요 문제는 또한 팝 된 요소가없는 원래 배열을 어떻게 반환할까요?Javascript - Array pop polyfill 코드

Array.prototype.pop = function() { 
    var myArray = this; 
    var length = myArray.length; 
    var element = myArray[length-1]; 
    myArray = myArray.slice(0,length-1); 
    return element; 
} 

var hello = [1,2,3,4,5]; 
hello.pop(); 
5 
console.log(hello) 
[1, 2, 3, 4, 5] 
+0

http://jsperf.com/manual-pop 그래서 당신이 팝업에 대한 polyfill을 원하는 :

는 어쨌든 나는 그것을 확인하는 작은 반환 한 테스트를 만들어? 마지막 요소를 반환하고 배열을 변경 하시겠습니까? – hereandnow78

+0

"가장 효율적인 방법": jsperf 응답을 참조하십시오. 가장 빠른 가능한 polyfill입니다 (여전히 10 배 느림 : P). 이 학습 그냥 가정합니다 –

답변

1

사용 splice 대신 slice-splice가하는 반면 slice는, 원래의 배열은 수정되지 않습니다.

즉, 마지막 요소를 제거하기 때문에 return myArray.splice(length-1,1); ...이 처음에는 return myArray.pop()의 별칭입니다.

var element = myArray[length-1]; 
myArray.length = length-1; 
return element; 
+0

myArray.length = 길이 -1 빈 배열에 대해 작동하지 않고 잡히지 RangeError 던졌습니다 : 잘못된 배열 길이 예외 및 코드에서 splice 호출 [0] 액세스해야합니다 또는 그렇지 않으면 단일 요소 또는 0 요소 배열 대신 값 자체 또는 정의되지 않음. :( –

1

짧고 달콤한 :

Array.prototype.foo = function(){ 
    return this.splice(this.length-1)[0]; 
}; 

반환 마지막 요소 또는 정의되지 않은 제로의 경우 길이와 배열 자체를 수정

또는보십시오.

0

아 성능 ... 왜 폴리필이 필요합니까? Array.prototype.pop은 광범위하게 지원됩니다!

+1

학습을 위해 ... 구현하지 마십시오. – KingKongFrog

+0

나는 jsperf 열정을 좋아한다 :) –