变量“通过引用”更新?

时间:2009-03-30 13:51:38

标签: javascript scope

我有以下简单的脚本。

<script>
SPC = {
    a : [10],
    b : 10,

    t: function()
    {
        y = this.a;
        z = this.b;
        y[0]++;
        z++;
        alert('this.a[0] = ' + this.a[0] + '\nthis.b = ' + this.b)
    }
}

SPC.t();
SPC.t();
</script>

在浏览器中运行它将显示两个警告框:

this.a [0] = 11 this.b = 10

this.a [0] = 12 this.b = 10

问题是,为什么this.a [0]的值会增加?我正在指定“y = this.a”并将“y”的元素更新为“y [0] ++;”?

与此同时,“b”发生了同样的事情:“z = this.b; z ++”。然而,“this.b”仍然等于10。

如何在不影响“this.a”的情况下更改本地范围内“y [0]”的值?

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

a是一个数组,您只需将对数组的引用复制到y。您需要将数组a内容复制到新数组 y中(使用Array.slice()y = a.slice()在你的情况下)是最简单的方法。)

(或者,如果您只需要a[0],则可以设置y = a[0]。对y的后续更改不会影响a[0],因为您正在复制该值。)

有关详细信息,请参阅this article中的“Javascript数组按引用分配”和“将数组作为值传递”部分。

答案 1 :(得分:2)

尝试Array.slice()功能。

y = this.a.slice()

这将创建a数组的副本并将其分配给y。因此,y的修改不会影响a

答案 2 :(得分:0)

您要将数组a和b的地址值分配给y和z。 因此,y和z成为a和b的精确副本。 而不是将地址值分配给y和z。 你只需要取a和b的内容值并将它们分配到y和z中 y = a [0]

z = b [0]

然后是y ++