2012-10-30 49 views
3

我在使用幾個相關數組時遇到了一種異常效應。打破了我的想法尋找錯誤後,終於找到了解決方案。但我想知道你們中的任何一位能否向我解釋爲什麼會發生這種情況。初始化時「數組粘貼」

我的代碼是這樣的:

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

在此之後,如果我這樣做:

sunday[2] = 'open'; 

我得到星期天[2] = '開放',星期一[2] = '開放',星期二[2] ='開放',...,星期六[2] ='開放'。就好像所有的變量都是「粘在一起」的,或者因爲沒有任何變化,所有這些變化都以相同的方式變化。

我已經這樣定的:

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

現在我得到的獨立變量。但我不喜歡這個解決方案,所以如果有人知道這個問題,我會很感激。 我在谷歌瀏覽器上運行JavaScript。

謝謝

+0

也看看@ http://stackoverflow.com/questions/7486085 /通過javascript-copy-array-by-value –

+0

謝謝,非常有用的鏈接。 –

+0

只是爲了防止未來的問題...在Python中會發生同樣的情況嗎? –

回答

4

問題是,在JavaScript中,對象類型(其中包括像closed這樣的數組)在實際對象(related question)中爲references。這意味着如果x是變量且其值爲對象類型,則y = x不會將x的副本放入y;它只是意味着你可以使用兩個名稱來引用同一個對象。

你在這裏實際需要的是創建closed(「克隆」它)的副本。因爲它是一個數組,你可以很容易地做到這一點與

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

爲了達到同樣的效果,您可以不帶參數調用切片。 'sunday = closed.slice();' – Waxen

+0

所以,我發現了其他方法,如:sunday =([])。的concat(閉合);閱讀「深層複製」,但我是OOP的新手,我沒有清楚這些概念。我將使用slice() –

8

數組是對象,而對象是引用類型。

每個變量sunday, monday, tuesday, etc...都包含對同一個數組的引用,因此每個變量都能夠觀察對該數組的更改。


看着你的代碼,我有一種直覺,也許你應該使用Object而不是Array。

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

只是一個預感。我以爲我會把它扔到那裏。

+2

爲了強調這一點:只有一個數組中有許多引用原始版本。 –

1

要獲得拷貝而不是引用到原來的數組,使用slice

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