受限 JavaScript Array Pop Polyfill 不工作
Restricted JavaScript Array Pop Polyfill not working
我正在为我正在使用的编译器创建一些特定的函数,但是编译器性质中的某些限制将阻止我使用本机 JavaScript 方法,如 Array.prototype.pop()
来执行数组流行...
所以我决定尝试编写一些基本的伪代码来尝试模仿该过程,然后将我的最终功能基于伪代码...但是我的测试似乎失败了...基于编译器当前的行为,它只允许我使用 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
和原始数组...如果发送初始空数组,undefined
应该只 return,就像您期望的 [].pop()
调用一样...
有人知道我如何调整此代码以正确模仿流行音乐吗?
虽然我听说 arr.splice(array.length-1,1)[0];
可能有效...编译器目前无法确定 splice
或类似方法...是否可以使用以下变体来实现我的代码?
提前致谢...
通过此修改,它有效:
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
现在的问题是删除最后一个元素。您应该在没有最后一个元素的情况下再次构造原始数组。您将遇到问题,因为您无法修改原始数组。这就是为什么这个任务是用 prototype
完成的(Array.prototype.pop2
也许可以帮助你)
你真是想多了[].pop()
。 As defined in the specs,[].pop()
的过程是:
- 获取数组的长度
- 如果长度为0
- return
undefined
- 如果长度大于0
- 在
length - 1
获取商品
- 减少
array.length
1
- Return 项。
(...加上 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
。重新阅读你的 post,看起来数组有一个 pop 方法,但编译器无法判断变量是否为数组。在那种情况下,这个函数的一个更简单的版本是这样的:
function pop(array) {
return Array.prototype.pop.call(array);
}
先试试这个,如果可行的话,速度会稍微快一些,也更稳健一些。它也是您可能需要使用的任何其他数组方法的模式。
我正在为我正在使用的编译器创建一些特定的函数,但是编译器性质中的某些限制将阻止我使用本机 JavaScript 方法,如 Array.prototype.pop()
来执行数组流行...
所以我决定尝试编写一些基本的伪代码来尝试模仿该过程,然后将我的最终功能基于伪代码...但是我的测试似乎失败了...基于编译器当前的行为,它只允许我使用 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
和原始数组...如果发送初始空数组,undefined
应该只 return,就像您期望的 [].pop()
调用一样...
有人知道我如何调整此代码以正确模仿流行音乐吗?
虽然我听说 arr.splice(array.length-1,1)[0];
可能有效...编译器目前无法确定 splice
或类似方法...是否可以使用以下变体来实现我的代码?
提前致谢...
通过此修改,它有效:
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
现在的问题是删除最后一个元素。您应该在没有最后一个元素的情况下再次构造原始数组。您将遇到问题,因为您无法修改原始数组。这就是为什么这个任务是用 prototype
完成的(Array.prototype.pop2
也许可以帮助你)
你真是想多了[].pop()
。 As defined in the specs,[].pop()
的过程是:
- 获取数组的长度
- 如果长度为0
- return
undefined
- return
- 如果长度大于0
- 在
length - 1
获取商品
- 减少
array.length
1 - Return 项。
- 在
(...加上 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
。重新阅读你的 post,看起来数组有一个 pop 方法,但编译器无法判断变量是否为数组。在那种情况下,这个函数的一个更简单的版本是这样的:
function pop(array) {
return Array.prototype.pop.call(array);
}
先试试这个,如果可行的话,速度会稍微快一些,也更稳健一些。它也是您可能需要使用的任何其他数组方法的模式。