Node.js变量在未对其执行任何操作的情况下进行更改

时间:2013-03-24 23:21:12

标签: node.js

我正在使用node.js服务器来进行多人同步骰子,但我有一些奇怪的问题,变量没有被引用或使用......

    var origonalRolls = rolls;

    //identify epic fails
    var epicFails = [];
    for(var r = 0; r < rolls.length; r++)
        if(rolls[r] === 1)
            epicFails.push(r);

    console.log("TEST 1 :: " + JSON.stringify(rolls));
    console.log("TEST 2 :: " + JSON.stringify(origonalRolls));
    //remove epic fails and the corresponding heighest
    if(epicFails.length > 0){
        for(var i = epicFails.length-1; i >= 0; i--){
            rolls.splice(epicFails[i], 1);
            if(rolls[rolls.length-1] >= success)
                rolls.splice(rolls.length-1, 1);
        }
    }
    console.log("TEST 3 :: " + JSON.stringify(rolls));
    console.log("TEST 4 :: " + JSON.stringify(origonalRolls));

上面应该找到rolls数组中的任何元素,然后将其添加到epicFails。然后它应该从rolls以及最高的剩余卷筒中移除它。 (注意,rolls按数字排序)

由于某种原因,这段代码的输出如下:

TEST 1 :: [1,1,2,3,3,6,7,7,9,9]
TEST 2 :: [1,1,2,3,3,6,7,7,9,9]
TEST 3 :: [2,3,3,6,7,7]
TEST 4 :: [2,3,3,6,7,7]

我不确定为什么rollsorigonalRolls开始相同而结尾相同。我只使用rolls

对这个问题的任何帮助和/或解释都是受欢迎的,这一直困扰着我很久......

2 个答案:

答案 0 :(得分:2)

在Javascript中数组和对象只是浅层复制 - 这意味着从另一个数组(originalRolls)复制的数组(roll)只是对originalRolls的引用 - 它不是一个全新的数组,修改一个值会影响另一方面的价值观。

您需要实现深层复制功能,以创建一个基于另一个的全新阵列。在这里和网上的其他地方有很多深度复制数组/对象 - 来自快速谷歌的here is one of them

答案 1 :(得分:0)

var origonalRolls = rolls;替换为:

var origonalRolls = [];
for (var i = 0, len = rolls.length; i < len; i++) {
    origonalRolls[i] = rolls[i];
}