我正在为我正在处理的编译器创建一些特定的函数,但编译器性质中的某些限制将阻止我使用像Array.prototype.pop()
这样的本地JavaScript方法来执行数组弹出...
所以我决定尝试编写一些基本的伪代码来尝试模仿这个过程,然后将我的最终函数基于伪代码...但我的测试似乎失败了...基于编译器的当前行为,它只允许我使用array.length
,数组元素分配,这是关于它...我的代码在下面......
pop2 = function(arr) {
if(arr.length>0){
for(var w=undefined,x=[],y=0,z=arr.length;y<=z;y++){
y+1<z?(x[y]=arr[y]):(w=arr[y],arr=x);
}
}
return w;
}
Arr = [-1,0,1,2];
// Testing...
console.log(pop2(Arr)); // undefined... should be 2
console.log(Arr); // [-1,0,1,2]... should be [-1,0,1]
我试图模仿pop
函数的性质,但似乎无法指出导致函数仍然提供undefined
和原始数组的原因...... {{ 1}}只应在发送初始空数组时返回,就像您对undefined
调用所期望的那样......
任何人都有关于如何定制此代码以正确模仿pop的任何线索?
虽然我听说[].pop()
可能有效......编译器目前无法确定arr.splice(array.length-1,1)[0];
或类似的方法......是否可以使用我的代码变体来实现?
提前致谢...
答案 0 :(得分:2)
你真的过分思考[].pop()
。 As defined in the specs,[].pop()
的流程是:
undefined
length - 1
array.length
减少1 (...加上JavaScript引擎在幕后需要做的一些事情,比如在数组上调用ToObject
,或者确保长度是无符号的32位整数。)
这可以通过下面的简单函数来完成,甚至不需要循环。
function pop(array) {
var length = array.length,
item;
if (length > 0) {
item = array[length - 1];
array.length -= 1;
}
return item;
}
修改强>
我假设编译器的问题是根本不了解Array.prototype.pop
。重新阅读你的帖子,它看起来像数组有一个pop方法,但编译器无法确定变量是否是一个数组。在这种情况下,这个函数的更简单版本就是:
function pop(array) {
return Array.prototype.pop.call(array);
}
首先尝试它,因为它会稍微更快,更强大,如果它工作。它也是您可能需要使用的任何其他数组方法的模式。
答案 1 :(得分:0)
通过此修改,它可以工作:
http://jsfiddle.net/vxxfxvpL/1/
pop2 = function(arr) {
if(arr.length>0){
for(var w=undefined,x=[],y=0,z=arr.length;y<=z;y++){
if(y+1<z) {
(x[y]=arr[y]);
} else {
(w=arr[y],arr=x);
break;
}
}
}
return w;
}
Arr = [-1,0,1,2];
// Testing...
console.log(pop2(Arr)); // 2
现在的问题是删除最后一个元素。您应该在没有last元素的情况下再次构造原始数组。您将遇到此问题,因为您无法修改原始阵列。这就是为什么这个任务与prototype
(Array.prototype.pop2
可能会帮助你)的原因