2014-02-27 49 views
1

如果我想从头开始编写pop函数,那么最有效的方法是什么?主要问题也是如何返回没有弹出元素的原始数组?Javascript - Array pop polyfill code

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

所以你要对流行一个填充工具?返回最后一个元素,并更改你的数组? – hereandnow78

+0

“最有效的方式”:请参阅jsperf答案,我放的是尽可能快的填充(仍然慢10倍:P)。我假设这只是为了学习 –

回答

1

使用splice而不是slice - slice不修改原始数组,而splice一样。

这就是说,因为你删除的最后一个元素,那将是return myArray.splice(length-1,1); ......这本质上是摆在首位return myArray.pop()的别名。

或者,尝试:

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

myArray.length = length-1不适用于空数组并抛出未捕获的RangeError:无效的数组长度异常,并且代码中的拼接调用需要访问[0],否则返回一个单个元素或零元素数组,而不是值本身或未定义。 :( –

1

简短而亲切:

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

返回最后一个元素或不确定的,如果长度为零,并修改该数组本身。

0

Ahh表现...为什么你需要这个polyfill? Array.prototype.pop广泛支持​​!

反正我创建了一个小PERF的测试,以检查:http://jsperf.com/manual-pop

+1

对于学习...不执行。 – KingKongFrog

+0

虽然我喜欢jsperf的热情:) –