2014-10-02 14 views
0

這裏我有一個Store構造函數,它有一個名爲arr的屬性,它是使用新的Array(height * width)創建的,提供的高度和長度作爲參數發送到Store構造函數。我知道的是新的Array(20)將創建一個包含20個元素的數組。什麼新的數組(20)實際上做

Store構造函數有一個prototype屬性,它使用map數組並填充new Store實例的this.arr。

但是令人驚訝的是,在填充過程之後數組長度得到了擴展。它變成了40.我知道push方法在數組的末尾插入元素。這是否意味着數組已經有20個元素。 但它應該是空的,對嗎?我很困惑!!!

var map=['d d d d d ', 
 
     'e e e e e '] 
 
function Store(width,height){ 
 
    this.width=width; 
 
\t this.height=height; 
 
\t this.arr=new Array(this.width*this.height); 
 
} 
 
Store.prototype.set=function(map){ 
 
    for(i=0;i<this.height;i++){ 
 
\t  for(j=0;j<this.width;j++){ 
 
\t \t  this.arr.push(map[i][j]); 
 
\t \t } 
 
\t } 
 
} 
 
var store=new Store(map[0].length,map.length); 
 
document.write('previously : '+store.arr.length+'</br>'); 
 
store.set(map); 
 
document.write('now : '+store.arr.length);

+1

'new Array(20)'不會創建一個「最多可容納20個項目」的數組,而是一個「.length」初始化爲「20」的空數組。但是,'.push()'總是隻在最後添加新的項目。 – Bergi 2014-10-02 13:07:07

回答

2

當你創建一個數組,其中Array構造函數,它創建了一個稀疏數組與指定的長度。所以當你說Array(20)時,它已經創建了一個包含20個元素的數組(通過改變length屬性),它還沒有定義。因此,假設長度設置爲5,並且您嘗試訪問0處的元素。現在,JavaScript將在Array對象中查找屬性0,並且它不會找到任何內容。所以,它將返回undefined。但是,當您執行類似array[0] = 1的操作時,它會指定屬性0,值爲1.因此,下一次查找array[0]時,它將返回1.實際上,只需創建陣列時,它就沒有任何內容。

關於push,從MDN's Array.prototype.push報價,

push()方法將一個或多個元素添加到數組的末尾,並返回該數組的新長度。

因此,無論什麼時候您都在向它推送數據,它一直在擴展數組。你可能想要做這樣的事情

this.arr[i][j] = map[i][j]; 
+0

所以當我創建一個數組時,會發生什麼情況假設新數組(5)。該數組的5個元素是什麼?它是一個空數組,它不是嗎? – 2014-10-02 13:06:19

+0

@ user3138436這不會是一個空數組。它將是一個具有5個「未定義」值的數組。 – 2014-10-02 13:07:08

+0

@ E_net4:不,它確實是一個空數組(使用'.length == 5') – Bergi 2014-10-02 13:07:48

1

new Array(20)創建一個具有20個元素是不確定的數組。但是陣列中的存儲空間是預先分配的。這被認爲是處理數組的更有效的方式。如果您事先知道陣列長度,請始終使用此方法。 (順便提一下,將陣列的所有元素都設置爲相同類型更爲有利)

如果預分配數組,則不要將元素推送到它。在陣列內賦值的元素,像這樣:

var map=['d d d d d ', 
 
     'e e e e e '] 
 
function Store(width,height){ 
 
    this.width=width; 
 
\t this.height=height; 
 
\t this.arr=new Array(this.width*this.height); 
 
} 
 
Store.prototype.set=function(map){ 
 
    for(i=0;i<this.height;i++){ 
 
\t  for(j=0;j<this.width;j++){ 
 
\t \t  this.arr[i*j+j] = map[i][j]; 
 
\t \t } 
 
\t } 
 
} 
 
var store=new Store(map[0].length,map.length); 
 
document.write('previously : '+store.arr.length+'</br>'); 
 
store.set(map); 
 
document.write('now : '+store.arr.length);

如果你不事先知道數組的大小,創建一個空的零長度數組,push(或unshiftpush放一個元素到數組中的最後一個位置,unshift將元素放置到數組中的第一個0索引位置)。這個工作比較慢,因爲每次push或unshift都會動態地改變數組的大小。

相關問題