Javascript:Unshift()导致无限循环,但可以';我不明白为什么

Javascript:Unshift()导致无限循环,但可以';我不明白为什么,javascript,Javascript,我正在尝试创建一个函数,它接受一个数组,并返回在奇数之前带有偶数的数组。我想我应该遍历数组,用模检查每个数字的可除性。如果它是偶数,我将该数字移到数组的前面并继续 我已经删除了unshift以记录它的迭代,因此我知道问题不在我的循环中 /// A = [3,5,6,3,4,2,1] var sortArrayByParity = function(A) { for (var x =0; x< A.length;x++) { if (A[x] % 2 == 0) {

我正在尝试创建一个函数,它接受一个数组,并返回在奇数之前带有偶数的数组。我想我应该遍历数组,用模检查每个数字的可除性。如果它是偶数,我将该数字移到数组的前面并继续

我已经删除了unshift以记录它的迭代,因此我知道问题不在我的循环中

/// A = [3,5,6,3,4,2,1]

var sortArrayByParity = function(A) {
    for (var x =0; x< A.length;x++) {
        if (A[x] % 2 == 0) {
           A.unshift(A[x])
        } 
    }
    return A;
};
///A=[3,5,6,3,4,2,1]
var sortArrayByParity=函数(A){
对于(变量x=0;x

出现最大堆栈错误

因为
unshift
将元素添加到数组中,从而增加其
长度。此外,一旦
unshift
将一个元素添加到数组的开头,下一个
A[x]
与上一个相同,因为所有元素都向右移动,包括
x
。因此循环永远不会结束,因为索引
x
永远不会达到不断增加的
长度


如果需要将元素添加到使用循环进行迭代的数组中,最好在从
长度
向下计数到
0
的循环中使用
push
。这样,循环将永远不会遍历添加的元素,它将遍历的元素也不会移动

取消移动数组时,将在该数组的开头添加一个元素并增加长度

让我们试试

让arr=[1];
log('arr=',arr',length=',arr.length);
取消移位(0);

log('arr=',arr',length=',arr.length)“我正在尝试创建一个函数,该函数接受一个数组并返回一个在奇数之前带有偶数的数组”,因此您希望返回该数组。像这样<代码>排序((A,b)=>(A&1)-(b&1))@Thomas awesome,没有想到位运算符。查看了sort的文档后,我发现这是可行的,但我不知道为什么:n.sort(函数(a,b){返回a%2-b%2 | | a-b;});首先返回偶数的是什么?
a&1
返回数字的最低位,它确定数字是偶数还是奇数(以0结尾的二进制数是偶数,以1结尾的二进制数是奇数)。请记住,此方法不适用于大数字,
a%2
通常更安全。@Kresimir感谢您的解释!