我正致力于提高我的javascript技能,我想了解pop()和push()背后的机制。我正在阅读Marijn Haverbeke的Eloquent Javascript书籍,我正在研究第4章Reversing Array exercise。我能够解决问题;然而,我遇到了一个有趣的怪癖。我的第一次代码尝试是:
var arr = ['a', 'b', 'c', 'd'];
function reverseArray(array){
var newArray = [];
console.log(array.length);
for(var i = 0; i <= array.length; i++){
newArray[i] = array.pop();
};
return newArray;
};
reverseArray(arr);
&#13;
这个结果是[&#39; d&#39;&#39; c&#39;&#39; b&#39;]以及&#39; a&#39;没有解决。我不明白为什么?有人可以解释一下吗?
我的第二次代码尝试是:
var arr = ['a', 'b', 'c', 'd'];
function reverseArray(array){
var newArray = [];
console.log(array.length);
for(var i = array.length - 1; i >= 0; i--){
newArray.push(array[i]);
};
return newArray;
};
console.log(reverseArray(arr));
&#13;
这导致了阵列的正确反转:[&#39; d&#39;&#39; c&#39;,&#39; b&#39;,&#39; a&#39;] 。有人可以解释为什么这有效吗?
提前致谢。
答案 0 :(得分:0)
这就是你的问题:
for(var i = 0; i <= array.length; i++){
newArray[i] = array.pop();
};
每次迭代:
i = 0 array.length: 4 //d
i = 1 array.length: 3 //c
i = 2 array.length: 2 //b
i = 3 array.length: 1 //a -- wont print
现在你的循环停止工作了,因为你告诉我们: -
i <= array.length
//3 <= 1 will return false so for loop stops
不确定您是否注意到,push()
和pop()
更改了.length
的{{1}}属性
答案 1 :(得分:0)
第一个函数没有返回预期的结果,因为当你pop
它的元素时,它会变短。每次循环比较数组 new length
。
您可以存储数组 initial length
并与之进行比较:
var arr = ['a', 'b', 'c', 'd'];
function reverseArray(array){
var newArray = [],
length = array.length; // save the initial length
for(var i = 0; i < length; i++){
newArray[i] = array.pop();
};
return newArray;
};
console.log(reverseArray(arr));