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));