JavaScript—;数组中充满了一堆“0”;“未定义”;s

JavaScript—;数组中充满了一堆“0”;“未定义”;s,javascript,arrays,sorting,Javascript,Arrays,Sorting,我是JavaScript新手,正在尝试实现选择排序,以便用数组弄脏我的手(注意:我知道有一个内置的排序函数)。不过,我遇到了一些奇怪的行为 这是我的密码: 函数选择排序(数组) { 设currentMin=0; var-minIndex=0; 函数交换(数组,i,j) { 设temp=array[i]; 数组[i]=数组[j]; 数组[j]=温度; } 对于(var i=0;i

我是JavaScript新手,正在尝试实现选择排序,以便用数组弄脏我的手(注意:我知道有一个内置的排序函数)。不过,我遇到了一些奇怪的行为

这是我的密码:

函数选择排序(数组)
{
设currentMin=0;
var-minIndex=0;
函数交换(数组,i,j)
{
设temp=array[i];
数组[i]=数组[j];
数组[j]=温度;
}
对于(var i=0;i”);
写入(“排序:”+字符串(排序)+“

”)问题在于:

swap(array, i, j);
当你调用它时,
j
array.length
,因此
array[j]
undefined
,因为你在数组的末尾

我想你的意思是:

swap(array, i, minIndex);
// ------------^^^^^^^^
使用该更改,并在将数组排序为“未排序”行之前而不是之后输出数组:

函数选择排序(数组)
{
设currentMin=0;
var-minIndex=0;
函数交换(数组,i,j)
{
设temp=array[i];
数组[i]=数组[j];
数组[j]=温度;
}
对于(var i=0;i”);
选择排序(myArray);
write(“排序:”+字符串(myArray)+“

”)问题在于:

swap(array, i, j);
当你调用它时,
j
array.length
,因此
array[j]
undefined
,因为你在数组的末尾

我想你的意思是:

swap(array, i, minIndex);
// ------------^^^^^^^^
使用该更改,并在将数组排序为“未排序”行之前而不是之后输出数组:

函数选择排序(数组)
{
设currentMin=0;
var-minIndex=0;
函数交换(数组,i,j)
{
设temp=array[i];
数组[i]=数组[j];
数组[j]=温度;
}
对于(var i=0;i”);
选择排序(myArray);

write(“排序:”+字符串(myArray)+“

”)我前面看到的一个关键问题是,您似乎认为
selectionSort
创建了一个新数组。没有。它返回与您传入的相同的值。因此,您的“未排序”和“已排序”是相同的,因为您在调用
selectionSort
后输出它们,并且它们都输出相同的数组。当您为(var j=i+1;j时,在循环
j
由于最后一个
j++/code>而超出数组的最大索引之后。因此,您将一个越界索引传递给
swap
。正如T.Crowder所写:在这个函数中放置一个返回是一个错误,因为该函数直接作用于数组data@MrJ返回数组不是一个错误。这样做没有意义,因为传入的数组会被直接修改。是的,没错,这只是糟糕的编程;)我前面看到的一个关键问题是,您似乎认为
selectionSort
创建了一个新数组。没有。它返回与您传入的相同的值。因此,您的“未排序”和“已排序”是相同的,因为您在调用
selectionSort
后输出它们,并且它们都输出相同的数组。当您为(var j=i+1;j时,在循环
j
由于最后一个
j++/code>而超出数组的最大索引之后。因此,您将一个越界索引传递给
swap
。正如T.Crowder所写:在这个函数中放置一个返回是一个错误,因为该函数直接作用于数组data@MrJ返回数组不是一个错误。这样做没有意义,因为传入的数组会被直接修改。是的,没错,这只是糟糕的编程;)谢谢你提供的所有有价值的信息!我习惯于C++语言和java语言。我将不得不重新讨论JavaScript如何处理函数参数,以避免将来出现这种情况。(除了选择排序之外,我还计划实现其他排序——我通常只是在使用新语言时做一个练习。)@AlexH——如果有帮助的话,JavaScript处理函数参数和对象引用的方式与Java处理方法参数和对象引用的方式完全相同。这两种语言都是纯传递值语言,对象引用在这两种语言中都是值。(这些语言相当复杂