Javascript,pop()和push()在数组排序函数后面的机制

时间:2017-02-25 20:45:53

标签: javascript arrays push computer-science pop

我正致力于提高我的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;
&#13;
&#13;

这个结果是[&#39; d&#39;&#39; c&#39;&#39; b&#39;]以及&#39; a&#39;没有解决。我不明白为什么?有人可以解释一下吗?

我的第二次代码尝试是:

&#13;
&#13;
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;
&#13;
&#13;

这导致了阵列的正确反转:[&#39; d&#39;&#39; c&#39;,&#39; b&#39;,&#39; a&#39;] 。有人可以解释为什么这有效吗?

提前致谢。

2 个答案:

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