更改数组值也会更改另一个已分配数组中的值

时间:2014-06-10 12:17:14

标签: javascript arrays

我正在学习Javascript和W3学校'代码编辑器我尝试以下代码:

    <!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var cars = ["Saab", "Volvo", "BMW"];
var newcars = [];
newcars = cars;
newcars[0] = "Benz"
document.getElementById("demo").innerHTML = cars[0];
</script>

</body>
</html>

我预计价值是:&#34;萨博&#34;因为我没有改变汽车阵列,唯一的变化是新车阵列,但输出是:&#34;奔驰&#34;。

有人可以解释一下发生了什么吗?

由于

3 个答案:

答案 0 :(得分:2)

如果要克隆cars数组,请使用slice

var newcars = cars.slice(0);

否则它们将指向内存中的相同数组(通过引用)。

答案 1 :(得分:0)

您使用相同的参考。

var cars = ["Saab", "Volvo", "BMW"];
var newcars = []; // new array! good!
newcars = cars; // points to cars. all changes will reflect both.
newcars[0] = "Benz"
document.getElementById("demo").innerHTML = cars[0];

您可能希望复制数组而不是引用。如果你使用Jquery比这更好:

// Shallow copy
var newObject = jQuery.extend([], oldObject);

// Deep copy
var newObject = jQuery.extend(true, [], oldObject);

答案 2 :(得分:0)

变量&#34;汽车的价值&#34;包含对数组的&#34;引用&#34;不是&#34;数组值&#34;。所以,当你喜欢&#34; var newcars = cars&#34;你实际上只是复制参考,这意味着&#34;汽车&#34;和&#34; newcars&#34;指向同一个数组。你需要制作一个阵列的另一个副本,其中包括&#34; cars&#34;指向然后让&#34; newcars&#34;参考该新副本。你可以用不同的方式克隆一个数组,可以使用像jQuery这样的库(比如here),下划线(比如here)或者没有像这里Copying array by value in JavaScript

这样的库来完成