JavaScript快速排序Partition函数数组传递与修改问题咨询
为什么Partition函数没返回数组,但原数组却被修改了?
这其实是JavaScript中引用类型传递的核心特性在起作用,我来给你拆解清楚:
核心原因:数组是引用类型
在JavaScript里,数组属于引用类型。当你把数组作为参数传给函数时,传递的并不是数组的完整副本,而是指向该数组在内存中实际存储位置的引用指针。这就意味着:
- 函数内部对这个参数的任何修改,都会直接作用于内存里的原数组对象
- 不管函数有没有返回这个数组,外部的原数组都会同步发生变化
结合你的代码具体分析
咱们对着你的代码一步步看:
- 当你调用
Partition(arr, start, end)时,arr参数拿到的是原数组的引用,不是新创建的数组副本 - 在
Partition的循环里,每次调用swap(arr, x, partitionIndex),swap函数直接通过引用操作原数组的元素位置:
这里的function swap(arr,firstIndex,secondIndex){ var temp = arr[firstIndex]; arr[firstIndex] = arr[secondIndex]; arr[secondIndex] = temp; }arr[firstIndex]和arr[secondIndex]都是直接修改原数组的元素,没有创建任何新数组。 - 所以哪怕
Partition只返回了partitionIndex,它内部的所有交换操作已经直接改变了原数组的内容。
极简示例辅助理解
用一个更简单的例子帮你强化这个概念:
function modifyArray(arr) { arr[0] = "我被修改了"; } let myArr = [1, 2, 3]; modifyArray(myArr); console.log(myArr); // 输出: ["我被修改了", 2, 3]
这个例子里函数也没有返回数组,但原数组依然被修改了,和你的快速排序代码逻辑完全一致。
补充:QuickSort返回arr的作用
你的QuickSort函数最后返回arr,其实只是把同一个引用返回出去而已——因为原数组已经被排序完成了,返回它只是方便你直接打印或者后续使用,就算去掉return arr,原数组也已经是排序后的状态了。
内容的提问来源于stack exchange,提问作者MaricelaO
相关产品推荐
相关产品推荐

