2010-12-09 44 views
9

我看到 4個 五個選項初始化數組在JS特定的長度,(最後一個是舒展的,我知道):數組(5)等價於var a = []; a.length = 5;在JS?

var a = []; a.length = 5; 

var a = Array(5); 

var a = []; a[4] = undefined; 

var a = new Array(5); 

function makeArrayToLength(length, default){ 
    var a = [], i = 0; 
    for(; i < length; i++){ 
     a[i] = default; 
    } 
    return a; 
} 

我肯定要(做)使用文字只要有可能,但我處於特定數組的定義方面是其長度的情況,所以我傾向於Array(5)。第一個例子相當於最終結果的第二個例子嗎?我意識到這在執行過程中並不等同。

回答

8

前兩個,和第三實施例是等效的,在端部它們產生僅與一個自己的財產length一個Array對象,包含5作爲其值。

當你調用使用單個數字參數(如Array(5);)的Array構造,新創建的對象將包含數爲length特性,索引屬性不創建:

var a = Array(5); 
a.hasOwnProperty('0'); // false 

第二個例子產生的結果如下:

var a = []; 
a.length = 5; 
a.hasOwnProperty('0'); // false 

關於第三個例子,它不等價,因爲它會創建一個prope RTY陣列物體上時,即使它的值是undefined

var a = []; a[4] = undefined; 
a.hasOwnProperty('4'); // true 

第四個例子:

var a = new Array(5); 

只是完全一樣的第二個(var a = Array(5);),有使用之間沒有差異Array構造函數有或沒有new運算符,在第二個示例中,您是calling the Array constructor as a function

最後,關於你的makeArrayToLength函數,現在我認爲你知道的並不完全相同,因爲所有的「索引屬性」都被初始化爲「默認」值。 (順便說一句不使用default作爲標識符,它是一個關鍵字...)

Array構造通常是可以避免的,因爲它可以有不同的說法用不同的行爲,例如:

Array("5"); // one element array, (["5"]) 
Array(5); // empty array, length = 5 
// v.s. 
["5"]  // one element array 
[5]   // one element array 

此外,Array構造函數可以被重寫,而數組文字將始終工作。

+0

你知道如果你打算把我的答案的一部分加入你的話,你可能會拋出我很高興。 – Hamish 2010-12-09 07:13:10

+0

@Hamish,很抱歉,我沒有在你的回答中加入「我的答案」,我剛編輯過來擴展我的答案(實際上我沒有注意到你的答案,直到我完成編輯),而不是第一個時間[我談論調用內置構造函數作爲函數](http://stackoverflow.com/search?q=user:5445+%22constructor+called+as+a+function%22):),但是,我認爲你的答案值得讚賞... – CMS 2010-12-09 07:24:32

2

是的,它們都產生相同的結果。

2和4是相同的,因爲,根據本ECMAScript spec

15.4.1數組構造作爲函數調用當陣列被稱爲一個 函數,而不是作爲構造, 它創建並初始化一個新的數組對象。因此函數調用 Array(...)等價於創建表達式new Array(...) 的對象 具有相同的參數。

1和2是等效的,因爲[]構建一個新的數組,並設置長度屬性等效於建設有new Array(length)in the spec)的數組。

選項3也是等效的,因爲:

...每當屬性添加其名稱是一個數組索引,length屬性被改變時,如果必要的話,爲比的數值一個更該數組索引

而選項5基本上只是選項3,但重複多次直到最大索引。

相關問題