受限制的JavaScript阵列Pop Polyfill无法正常工作

时间:2015-11-30 14:03:26

标签: javascript arrays restriction

我正在为我正在处理的编译器创建一些特定的函数,但编译器性质中的某些限制将阻止我使用像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];或类似的方法......是否可以使用我的代码变体来实现?

提前致谢...

2 个答案:

答案 0 :(得分:2)

你真的过分思考[].pop()As defined in the specs[].pop()的流程是:

  1. 获取数组的长度
  2. 如果长度为0
    1. return undefined
  3. 如果长度大于0
    1. 获取length - 1
    2. 上的项目
    3. array.length减少1
    4. 退货。
  4. (...加上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元素的情况下再次构造原始数组。您将遇到此问题,因为您无法修改原始阵列。这就是为什么这个任务与prototypeArray.prototype.pop2可能会帮助你)的原因