Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组';胶合';初始化时_Javascript_Arrays_Google Chrome - Fatal编程技术网

Javascript 数组';胶合';初始化时

Javascript 数组';胶合';初始化时,javascript,arrays,google-chrome,Javascript,Arrays,Google Chrome,我在使用几个相关数组时发现了一种疏远效应。在我绞尽脑汁寻找错误之后,我终于找到了解决办法。但我想知道你们中是否有人能解释为什么会发生这种情况 我的代码是这样的: var closed =['closed', 'closed', ..., 'closed']; sunday = closed; ... saturday = closed; 在此之后,如果我这样做: sunday[2] = 'open'; 我有星期天开放,星期一开放,星期二开放,星期六开放。这就像所有的变量都被“粘合”或链接,因

我在使用几个相关数组时发现了一种疏远效应。在我绞尽脑汁寻找错误之后,我终于找到了解决办法。但我想知道你们中是否有人能解释为什么会发生这种情况

我的代码是这样的:

var closed =['closed', 'closed', ..., 'closed'];
sunday = closed;
...
saturday = closed;
在此之后,如果我这样做:

sunday[2] = 'open';
我有星期天开放,星期一开放,星期二开放,星期六开放。这就像所有的变量都被“粘合”或链接,因为无论你改变什么,它们都以相同的方式改变

我是这样修复的:

var closed1 =['closed', 'closed', ..., 'closed'];
...
var closed7 =['closed', 'closed', ..., 'closed'];
sunday = closed1;
...
saturday = closed7;
现在我得到了独立变量。但是我不喜欢这个解决方案,所以如果有人知道这个问题,我将不胜感激。 我正在谷歌浏览器上运行JavaScript


谢谢

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

每个变量
星期日、星期一、星期二等。
都包含对同一数组的引用,因此每个变量都能够观察到对该数组的更改


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

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

只是一种预感。我想我会把它扔出去。

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

实际上,您希望在这里创建
已关闭的
(“克隆”它)的副本。由于它是一个数组,您可以轻松地使用

sunday = closed.slice(0); // etc

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

var closed = ['closed', 'closed', ... ];
var sunday = closed.slice();
var monday = closed.slice();

为了强调这一点:在原始版本中只有1个数组具有许多引用。另外,请查看@以防止将来出现问题。。。在Python中也会发生同样的情况?请看一看,您可以在不使用参数的情况下调用slice以获得相同的效果<代码>星期天=closed.slice()所以,我找到了其他方法,比如:sunday=([]).concat(closed);阅读关于“深度复制”的文章,但我是OOP新手,对这些概念不太清楚。我将使用slice()