Javascript 如何正确编写反向函数?
我有一个问题,我需要帮助解决这个问题 我的反转功能不能按我希望的方式工作Javascript 如何正确编写反向函数?,javascript,Javascript,我有一个问题,我需要帮助解决这个问题 我的反转功能不能按我希望的方式工作 函数反转arrayinplace(数组){ 让old=数组; for(设i=0;i{ for(设i=0;i{ for(设i=0;i。只需走一半长度,交换元素i和length-i-1。然后你有一个真正的就地算法,没有额外的内存,它是单次通过。创建第二个数组似乎是一种浪费——如果要这样做,还不如.reverse()。数组赋值不会复制值。它与所有非原始类型的对象引用相同。正如妮娜指出的,考虑创建一个新数组,然后填充它。哦,真的
函数反转arrayinplace(数组){
让old=数组;
for(设i=0;i console.log(arrayValue)代码>变量,带有指定的对象(数组,实际上是一个修改过的对象)-只存储指向该对象的链接,而不存储实际对象。所以,让old=array代码>这里您刚刚创建了一个指向同一数组的新链接。两个变量的任何更改都将导致数组的更改
(演示)
设arr=[0,0,0,0];
设bubu=arr;
bubu[0]=999
控制台日志(arr)代码>变量,带有指定的对象(数组,实际上是一个修改过的对象)-只存储指向该对象的链接,而不存储实际对象。所以,让old=array代码>这里您刚刚创建了一个指向同一数组的新链接。两个变量的任何更改都将导致数组的更改
(演示)
设arr=[0,0,0,0];
设bubu=arr;
bubu[0]=999
控制台日志(arr)
您在old
变量中有相同的数组(不是按值,而是按引用),因此,如果您更改其中任何一个变量,那么这两个变量都会发生更改
因此,您应该创建新数组,根据需要使用它们并返回它(或者,如果您不想从函数返回任何内容,只需将值复制回原始数组)
事情就这样发生了,因为:
1) arr[0]=arr[4]
(5,2,3,4,5)
2) arr[1]=arr[3]
(5,4,3,4,5)
n) arr[n]=arr[0]
(5,4,3,4,5)
因此,您只需制作一个副本(let old=array.slice()
),它就会像您所期望的那样工作。您在old
变量中有相同的数组(不是按值,而是按引用),因此,如果您更改其中任何一个,那么这两个变量都会发生更改
因此,您应该创建新数组,根据需要使用它们并返回它(或者,如果您不想从函数返回任何内容,只需将值复制回原始数组)
事情就这样发生了,因为:
1) arr[0]=arr[4]
(5,2,3,4,5)
2) arr[1]=arr[3]
(5,4,3,4,5)
n) arr[n]=arr[0]
(5,4,3,4,5)
因此,您只需制作一个副本(let old=array.slice()
),它就会像您期望的那样工作。如果您正在编写一个真正的算法,从速度和内存的角度来看,制作一个不必要的副本是浪费时间的(正如其他答案所指出的--array
和old
是原始代码中的别名)
更好的方法是迭代数组的一半,将每个元素与其长度-1-i
互补项交换。这有slice
方法迭代次数的1/4,更直观,并且使用恒定时间内存
const reversearlayinplace=a=>{
for(设i=0;i如果您正在编写一个真正的算法,那么从速度和内存的角度来看,制作一个不必要的副本是浪费时间的(正如其他答案所指出的--array
和old
是原始代码中的别名)
更好的方法是迭代数组的一半,将每个元素与其长度-1-i
互补项交换。这有slice
方法迭代次数的1/4,更直观,并且使用恒定时间内存
const reversearlayinplace=a=>{
for(设i=0;i 控制台日志(a)代码>数组的赋值不会复制值。它与所有非原始类型的对象引用相同。正如妮娜指出的,考虑创建一个新数组,然后填充它。哦,真的,我将使用一个切片来复制ARRAYI,不使用<代码>切片< /代码>。只需走一半长度,交换元素i
和length-i-1
。然后你有一个真正的就地算法,没有额外的内存,它是单次通过。创建第二个数组似乎是一种浪费——如果要这样做,还不如.reverse()
。数组赋值不会复制值。它与所有非原始类型的对象引用相同。正如妮娜指出的,考虑创建一个新数组,然后填充它。哦,真的,我将使用一个切片来复制ARRAYI,不使用<代码>切片< /代码>。只需走一半长度,交换元素i
和length-i-1
。然后你有一个真正的就地算法,没有额外的内存,它是单次通过。创建第二个数组似乎是一种浪费——如果要这样做,还不如.reverse()
。