2014-01-23 19 views
6

創建3個未定義的空數組。javascript數組 - 什麼是真正的表達式?

var a1 = [,,,]; 
var a2 = new Array(3); 

從JavaScript:權威指南,

0 in a1 //true 
0 in a2 //false 

但是,在現實世界中的瀏覽器,得到不同的結果。 (IE8和Chrome 33 ...)

0 in a1 //false 
0 in a2 //false 

這是真的,書還是現實世界?

+2

看起來這本書是錯的。正如你可以從規範中看到的,http://es5.github.io/#x11.1.4,'[,,,]'不會爲數組添加任何值。 –

+2

@ user2864740:不,'[,,,]'是**不**,[undefined,undefined,undefined,undefined]'。 –

+0

@FelixKling它是未定義的 –

回答

6

外貌喜歡這本書是錯的。正如你可以從specification看到,[,,,]沒有任何值添加到陣列中:

生產ArrayLiteral:省音選擇]的評價如下:

  1. 陣列是創建新對象的結果,就像通過表達式new Array()一樣,其中數組是具有該名稱的標準內置構造函數。
  2. 是評估的結果Elision;如果不存在,則使用數字值零。
  3. 調用[[Put]]數組的內部方法,其參數爲「length」,pad和false。
  4. 返回數組。

(「省音」是未由表達式之前或之後的,。)

簡單來說:

  • 創建一個空數組
  • 評估,,它基本上只是算他們,從1 所以,,,結果在3
  • 然後設置開始數組的length到結果(例如3)。

而這正是new Array(3)所做的。


還有消隱元件的不太正式描述:

陣列元件可在開始時被省略,中間或元素列表的末尾。只要元素列表中的逗號前面沒有AssignmentExpression(即逗號在開頭或逗號之後),缺少的數組元素將有助於數組的長度並增加後續元素的索引。未定義數組元素。如果一個元素在數組末尾消失,那麼該元素不會影響數組的長度。

+0

@ user2864740:這就是我鏈接到的。 –

+0

接近頂端:「..丟失的[aka elided]數組元素有助於數組的長度並增加後續元素的索引。數組元素不*定義。」 – user2864740

+0

哦,我看到........ –

2

數組構造函數(new Array(3))確實將length屬性設置爲3,但不創建數組的任何成員 - 甚至未定義的值。

如果只有一個參數傳遞給Array構造函數,並且該參數爲Number,則構造函數將返回一個新的稀疏數組,其長度屬性設置爲參數的值。應該注意的是,只有新數組的長度屬性纔會這樣設置;數組的實際索引不會被初始化。

來源:http://bonsaiden.github.io/JavaScript-Garden/#array.constructor

測試,在鉻確實導致兩個假值...

in操作如果給定的鍵不存在,返回false:

var a1 = [1,,3,4]; 

0 in a1 // true 
1 in a1 // false 
相關問題