冻结javascript中的变量值

时间:2014-11-10 19:52:24

标签: javascript arrays closures

我在javascript中在特定时间保存变量值时遇到问题。在基本级别,在下面的代码中,我希望变量' b'保持分配的值

var a = [];
var b = '';
var c = 'value';

a.push(c);
b = a;
console.log(b); // b = ["value"]
a.push(c);
console.log(b); // b = ["value", "value"], but i want it to be just ["value"]

我已经看到使用闭包的类似问题的各种解决方案,例如:Intentionally "freezing" a javascript variable using a self-executing function。我在这个Jsbin中试过这个解决方案失败了:http://jsbin.com/zusara/1/edit?js,console

非常感谢任何帮助。 谢谢,最好!

2 个答案:

答案 0 :(得分:3)

将数组分配给变量不会复制。因此,ab变量都指向同一个数组,通过任一变量进行的任何更改都将显示在另一个变量中。

如果你想在Javascript中复制一个数组,那么你必须明确地复制一个数组。

var a = [];
var c = 'value';
a.push(c);
// make shallow copy of a into b
var b = a.slice(0);

b现在包含一个完全独立的数组,a的修改不会影响b

注意:这是浅拷贝,不是深拷贝,是阵列的解决方案。浅拷贝不会复制数组中的对象或这些对象中的对象。进行深层复制需要更多代码,但通常不是必需的,在您提供的示例中似乎不需要。


如果你想要一个深层拷贝,并且想要包含对象,那么不仅仅是数组(我为数组的浅层副本提供了简单的解决方案),你可以看到这个参考有很多选项和辩论:

What is the most efficient way to deep clone an object in JavaScript?

答案 1 :(得分:1)

实现此目的的一种方法是使用切片功能。

而不是: b = a;

尝试使用:

b = a.slice();