2016-08-19 33 views
8

我從幾頁中讀取的密集數組的解釋似乎彼此矛盾。我想要了解它是什麼。究竟是密集陣列?

雖然一些鏈路(search result 1search result 2)表明,它簡單地是當陣列:

  1. 所述陣列的元件是已知的特定值;並且
  2. 在其初始化時被分配給該陣列。

典型的說法是JavaScript數組很密集。

這一切都有道理,直到這裏。

但是從JavaScript Guide on the Mozilla Developer Network (MDN)採取這一聲明說:

由於陣列的長度可以在任何時間改變,並且數據可被存儲在所述陣列中的非連續位置,JavaScript數組是 不保證密集;這取決於程序員如何選擇 來使用它們。一般而言,這些都是方便的特點;但如果 這些功能不適合您的特定用途,那麼可以考慮使用類型化數組。

這讓我感到困惑。我的問題是:

當MDN頁面上的聲明表示JavaScript數組不保證密集時,它是什麼意思?如果這意味着以下內容不是密集數組,因爲它的一個或多個元素在初始化時爲undefined,那麼爲什麼上面列出的鏈接似乎表明JavaScript數組確實密集?

var array = new Array(1, , 3,); // [1, undefined, 3, undefined] 
+3

數組初始化的方式是無關緊要的,它現在*的數組*狀態是重要的。一個給定的數組是否是密集的可以在數組的壽命中改變:'var arr = [1,2,3,4]'創建一個密集數組,但是如果你繼續說'arr [ 20] = 20'現在你有一個稀疏的數組。 – nnnnnn

+0

@nnnnnn謝謝,我明白了。作爲每個元素的隱喻密集都有價值,因此需要記憶。 –

+0

這是無效的語法,順便說一下:'new Array(1,,3,)'。你可能會把它與[1,3,]混淆。 – 2016-08-19 03:23:08

回答

8

「密」與「稀疏」相反,並且通常在談論存儲時使用。例如,該陣列是緻密:

a = [undefined, undefined, 2] 

它可以被存儲在存儲器完全一樣:的三個位置的序列,前兩個是undefined,第三個是2

這個陣列是稀疏:

a = [] 
a[100000000] = 100000000 

它不被存儲在存儲器中,作爲100000001個位置的序列,因爲這將是效率極其低下。絕對不是100000000undefined之後是100000000。相反,它只是說第1億個是100000000,並且沒有空間分配給前1000000個元素。

(實際上,嘗試用2代替100000000要做到這一點,你會發現一個奇怪的事情:Chrome瀏覽器將顯示密集排列爲[undefined, undefined, 2],但稀疏一個爲[undefined × 2, 2]

+0

我不知道可怕的低效率是否正確,我認爲Underscore.js的維護者在這一點上爭論不休,結果形成了一個名爲Lodash的Underscore叉。 – vol7ron

+0

關於Chrome如何在控制檯中顯示數組的問題,關於如何在控制檯中顯示數組的問題,如果缺少1個元素與值爲undefined的元素相比,它會顯示undefined x 1而不是undefined,所以您可以總是告訴什麼是... – nnnnnn

+1

我會說你不能真正爭論它:分配100000000個內存位置來存儲一個值是低效的。這不是一般性陳述(「密集陣列效率低下」),而是一種特定於此場景的特性。 – Amadan

4

那些文章說你可以創建一個密集的數組。這意味着,在創建時,這種陣列是緻密,因爲在像陣列:

每個元素被設置:從0到長度-1,沒有未定義的值。或者更好地說:從0到長度-1的每個位置被分配一個值(即使該值實際上是undefined)。

然而,可以使不這些陣列密集了,通過執行這樣的事情:

a[20] = "bat"; 

即陣列,這是緻密,不密實了,因爲元件0 1 2和20(不同於元素在3到19)被設置爲一個值(這個數組有4個元素,而不是21個)。

+0

謝謝。我只是不得不隨機選一個。 –