3

当我使用几个相关的数组时,我发现了一种疏离效应。在打破我的思想寻找错误之后,我终于找到了解决方案。但我想知道你们中的任何人是否可以向我解释为什么会发生这种情况。

我的代码是这样的:

var closed =['closed', 'closed', ..., 'closed'];
sunday = closed;
...
saturday = closed;

在此之后,如果我这样做:

sunday[2] = 'open';

我得到 sunday[2] = 'open',monday[2] = 'open',tuesday[2] = 'open',...,saturday[2] = 'open'。就像所有变量都被“粘合”或链接在一起,因为无论您更改哪个,它们都以相同的方式更改。

我以这种方式修复了它:

var closed1 =['closed', 'closed', ..., 'closed'];
...
var closed7 =['closed', 'closed', ..., 'closed'];
sunday = closed1;
...
saturday = closed7;

现在我得到了自变量。但我不喜欢这个解决方案,所以如果有人知道这个问题,我将不胜感激。我在谷歌浏览器上运行 JavaScript。

谢谢

4

3 回答 3

8

数组是对象,对象是引用类型。

每个变量sunday, monday, tuesday, etc...都持有对同一个数组的引用,因此每个变量都能够观察到该数组的变化。


查看您的代码,我有一种直觉,也许您应该使用对象而不是数组。

var closed = {
    sunday:    'closed',
    monday:    'open',
    tuesday:   'open',
    wednesday: 'open',
    thursday:  'open',
    friday:    'open',
    saturday:  'closed'
};

不过只是预感。以为我会把它扔在那里。

于 2012-10-30T15:32:39.073 回答
4

问题是在 JavaScript 中,对象类型(包括closed您的示例中的数组)是对实际对象的引用(相关问题)。这意味着 ifx是一个变量,并且它的值是对象类型,y = x不会将副本x放入y; 它只是意味着您可以使用这两个名称来引用同一个对象。

您在这里真正想要的是创建closed(“克隆”它)的副本。因为它是一个数组,你可以很容易地做到这一点

sunday = closed.slice(0); // etc
于 2012-10-30T15:33:38.187 回答
1

要获取副本而不是对原始数组的引用,请使用slice

var closed = ['closed', 'closed', ... ];
var sunday = closed.slice();
var monday = closed.slice();
于 2012-10-30T15:43:17.433 回答