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;iconsole.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()