在推入阵列时变量不保持正确的数组

时间:2015-05-28 03:09:42

标签: javascript arrays

如何正确定位我的startA变量,以便它是我推向结果数组的第一个数组?

从我的输出结果可以看出,我推送到结果数组的第一个数组实际上是我的结束数组。

这是一个变量范围问题吗?因为,我已经预先定义了一个 startA 变量,它保存了初始起始值([1,1]),为什么输出我的 startA 变量仍然是[7,7]?这不是一个副值副本,因为它是一个原始类型而不是引用类型吗?

// Tick Toward
function tickToward(start, end) {
    var startA = start;
    var results = [];
    results.push(startA);
    for (var i = 0; i < start.length; i++) {
        if (start[i] < end[i] && start[i + 1] < end[i + 1]) {
            start[i] += 1;
            start[i + 1] += 1;
            var a = [start[i],start[i+1]];
            results.push(a);
            // console.log("Condition 1");
            i--;
        } else if (start[i] > end[i] && start[i + 1] > end[i + 1]) {
            start[i] -= 1;
            start[i + 1] -= 1;
            var b = [start[i],start[i+1]];
            results.push(b);
            // console.log("Condition 2");
            i--;
        } else if (start[i] > end[i] && start[i + 1] < end[i + 1]) {
            start[i] -= 1;
            start[i + 1] += 1;
            var c = [start[i],start[i+1]];
            results.push(c);
            // console.log("Condition 3");
            i--;
        } else if (start[i] < end[i] && start[i + 1] > end[i + 1]) {
            start[i] += 1;
            start[i + 1] -= 1;
            var d = [start[i],start[i+1]];
            results.push(d);
            // console.log("Condition 4");
            i--;
        } else if (start[i] > end[i] && start[i + 1] == end[i + 1]) {
            start[i] -= 1;
            var e = [start[i],start[i+1]];
            results.push(e);
            // console.log("Condition 5");
            i--;
        } else if (start[i] < end[i] && start[i + 1] == end[i + 1]) {
            start[i] += 1;
            var f = [start[i],start[i+1]];
            results.push(f);
            // console.log("Condition 6");
            i--;
        } else if (start[i] == end[i] && start[i + 1] > end[i + 1]) {
            start[i + 1] -= 1;
            var g = [start[i],start[i+1]];
            results.push(g);
            // console.log("Condition 7");
            i--;
        } else if (start[i] == end[i] && start[i + 1] < end[i + 1]) {
            start[i + 1] += 1;
            var h = [start[i],start[i+1]];
            results.push(h);
            // console.log("Condition 8");
            i--;
        }
    } console.log(results);

}


tickToward([1, 1], [7, 7]); // Output should be [ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ], [ 6, 6 ], [ 7, 7 ] ]

// However, my output is [ [ 7, 7 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ], [ 6, 6 ], [ 7, 7 ] ]

以下是有兴趣的人提出的问题: http://i.stack.imgur.com/5UR5T.png

1 个答案:

答案 0 :(得分:2)

  

这不是一个副值副本,因为它是原始类型而不是引用类型吗?

var startA = start;

此行导致问题。它创建了一个引用而不是单个副本。

您需要使用&#39; slice()&#39;这将克隆数组。

var startA = start.slice();

<强> Demo