Javascript,数组排序函数中 pop() 和 push() 背后的机制
Javascript, mechanics behind pop() and push() in a array sort function
我正在努力提高我的 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);
此结果为 ['d'、'c'、'b'],并且 'a' 未解析。我不明白为什么?有人可以解释一下吗?
我的第二次代码尝试是:
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));
这导致数组的正确反转:['d'、'c'、'b'、'a']。有人可以解释为什么这有效吗?
这是你的问题:
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
属性 的 Array
第一个函数没有 return 预期的结果,因为当你 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));
我正在努力提高我的 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);
此结果为 ['d'、'c'、'b'],并且 'a' 未解析。我不明白为什么?有人可以解释一下吗?
我的第二次代码尝试是:
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));
这导致数组的正确反转:['d'、'c'、'b'、'a']。有人可以解释为什么这有效吗?
这是你的问题:
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
属性 的 Array
第一个函数没有 return 预期的结果,因为当你 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));