【问题标题】:Having trouble with variable reference in javascriptjavascript中的变量引用有问题
【发布时间】:2013-06-09 00:41:32
【问题描述】:

我正在尝试从原始点导出网格上的 4 个点。这些包括左、右、下和上一个单位。

如果我从[4, 5] 开始,我的输出应该是[3, 5] [5, 5] [4, 4] [4, 6]

我可能会查找如何执行此操作,但我一直在使用自己的方法,并且我认为我的逻辑是合理的,但是当我声明 var tempArr = cords; 时,我遇到了 JavaScript 本身的一个简单问题,从那时起,对tempArr 的任何更改似乎都会影响cords。我以前从来没有遇到过这个问题,这里是代码。

var output = [],
    cords = [4, 5];

var convertToCords = function(i){
    var tempArr = cords;
    var offset = ( ( i%2 ) * 2 ) - 1, // -1, 1, -1, 1
        index = Math.floor(i/2);      // 0, 0, 1, 1
    tempArr[index] = cords[index] + offset;
    return tempArr;
}

for (var i = 0; i < 4; ++i){
    console.log(cords);    
    newCords = convertToCords(i);
    var x     =   newCords[0],
        y     =   newCords[1];
    array[i] = "[" + x + ", " + y + "]";
}
console.log(output);


tempArr[index] = cords[index] + offset;

问题: 谁能发现为什么当我对tempArr 做某事时,cords 也会受到影响?我应该以其他方式声明tempArr 吗?

jsFiddle

【问题讨论】:

    标签: javascript variables pass-by-reference


    【解决方案1】:

    var tempArr = cords; 是你的问题。 cordstempArr 指的是同一个数组对象,即使变量名不同。您需要克隆原始数组:

    var tempArr = cords.slice(0);
    

    【讨论】:

    • 这似乎有悖常理,有什么了解为什么会这样吗?您的解决方案解决了问题,因此我将其标记为已回答,但我仍然对这种行为感到困惑。使用slice 似乎也是一种解决方法,还有其他方法吗?
    • @Jamil:是什么让你觉得它不直观?至于.slice(),这就是你对数组对象进行浅层克隆的方式。
    • 也许是因为我习惯了 php,我必须在其中添加 &amp; 才能获得这种行为。假装你没有你的经验,并且像我一样对这个比较陌生。您是否不同意这是违反直觉的,因为您正在向对象添加操作只是试图进行精确克隆?不管怎样,感谢您的帮助!
    • @Jamil:如果语言决定为我克隆对象,我会发现它更违反直觉。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多