【问题标题】:AS2 array gets changed when other array is passed to function?将其他数组传递给函数时,AS2 数组会发生变化吗?
【发布时间】:2015-12-14 07:42:59
【问题描述】:

我正在构建一个奥赛罗 AI,但遇到了一个奇怪的 AS2 问题。

通过将初始数组(arr_nums) 传递给它来设置一个临时数组(arr_temp) 等于函数的返回(timesTen();)。

为什么它也会改变初始数组?

我能找到重现问题的最简单方法:

arr_nums = [0,1,2,3,4,5,6,7,8,9,10];


timesTen = function(deltaArr){
    for(i = 0; i < deltaArr.length; i ++){
        deltaArr[i] *= 10;
    }
    return(deltaArr);
}


test = function(){
    arr_temp = timesTen(arr_nums);
    trace('temp: ' + arr_temp);
    trace('nums: ' + arr_nums);
}

test();

以上代码将跟踪以下内容:

temp: 0,10,20,30,40,50,60,70,80,90,100
nums: 0,10,20,30,40,50,60,70,80,90,100

首选跟踪:

temp: 0,10,20,30,40,50,60,70,80,90,100
nums: 0,1,2,3,4,5,6,7,8,9,10

即使我没有通过 arr_nums 并如下更改测试,它也会生成相同的输出:

test = function(){
    arr_temp = arr_nums;
    arr_temp = timesTen(arr_temp);
    trace('arr_temp: ' + arr_temp);
    trace('arr_nums: ' + arr_nums);
}

现在已经拼命尝试、测试和搜索 2 天,但仍然不知道出了什么问题以及如何解决?

非常感谢任何想法!

【问题讨论】:

  • 你在某处声明你的变量吗?我没有看到任何“var”
  • 在第 1 行和第 13 行,我使用了惰性方法“array = [0,1,2...];”而不是“var arr_nums:Array = [0,1,2...];”。为您简化代码。

标签: arrays loops return actionscript-2 trace


【解决方案1】:

发生这种情况是因为您实际上修改了原始数组,而不是使用它的浅拷贝。

timesTen = function(deltaArr){
    var result = deltaArr.slice();

    for(i = 0; i < result.length; i ++){
        result[i] *= 10;
    }

    return result;
}

【讨论】:

  • 刚刚注意到,对于多级数组,您还必须对每个子数组进行切片才能进行深度复制。是一个 for 循环要走的路还是有一个简单的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2020-07-28
  • 2017-04-30
  • 2021-02-21
相关资源
最近更新 更多