You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sortOn()问题:复制数组排序时原数组同步排序的原因排查

问题原因与解决办法

嘿,这个问题我太熟了——你踩中了ActionScript 3里引用类型的经典坑!

你以为用var myArrayCopy = myArray as Array创建了数组副本,但实际上这根本没生成新数组,只是给同一个数组对象多起了个“别名”而已。AS3里数组属于引用类型,这类对象赋值时,复制的不是数据本身,而是指向内存中数组实例的“地址”。所以myArray和myArrayCopy其实指向的是同一个数组,你对其中任何一个做排序,另一个自然也会跟着变。

简单解释下原理:

  • 像int、String这种值类型,赋值时会直接复制数据;
  • 而Array、自定义类实例这种引用类型,赋值只是拷贝指向对象的引用,两个变量共享同一个对象实例。

正确的数组拷贝方式

如果只是要一维数组的浅拷贝(或者二维数组但不需要拷贝子数组),用这两种方法就行:

  • slice(0):调用数组的slice方法并传入起始索引0,会返回一个包含原数组所有元素的新数组;
  • concat():不带参数的concat方法会返回原数组的拼接副本,本质也是新数组。

要是你的二维数组需要深拷贝(连子数组也独立出来,避免修改副本的子数组影响原数组),就得遍历每个子数组单独拷贝:

修正后的代码示例

var myArray = [["stuff", "stuff"], ["stuff", "stuff"]];
// 方式1:浅拷贝二维数组(子数组还是引用)
var myArrayCopy = myArray.slice(0); 

// 方式2:深拷贝二维数组(子数组也独立)
// var myArrayCopy:Array = [];
// for each(var subArr:Array in myArray) {
//     myArrayCopy.push(subArr.slice(0));
// }

trace(myArray); // 输出未排序数组
trace(myArrayCopy); // 输出未排序数组

myArrayCopy.sortOn(1, Array.CASEINSENSITIVE);

trace(myArray); // 依旧是未排序的原数组
trace(myArrayCopy); // 输出排序后的副本数组

这样修改后,myArrayCopy就是完全独立的数组了,排序操作只会影响它,原数组能保持初始状态。

内容的提问来源于stack exchange,提问作者Magnus Myrgård

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:36:11