2014-01-11 40 views
1

在控制檯上,我試圖創建一個循環數組,我相信如果試圖遍歷它會導致堆棧溢出,但我甚至無法得到它的長度。爲什麼這會返回0的長度?

var a = []; 
a['b'] = a; 

a.length; 
// 0 

a['c'] = c; 
a.length; 
// 0 

enter image description here

+0

第一個相關鏈接很好地解釋了這個問題:http://stackoverflow.com/questions/5223/length-of-javascript-object-ie-associative-array?rq=1 –

+0

'a ['b']'assigns屬性'b'來反對'a'。無論什麼類型的「a」都沒關係。 – cgTag

回答

4

它有一個0因爲length陣列length屬性返回比最高數字指數更高一些的。

你會得到一個1如果length你這樣做:

var a = []; 
a[0] = a; 
a.length; // 1 

您可以指定具有字符串鍵的屬性數組,它會在陣列中的「工作」是對象,可以有額外的屬性,但只有數字(整數)索引屬性參與數組行爲,如.length.slice()。如果你想使用字符串鍵,你應該使用一個普通的對象:

var a = {}; 

(平原)的對象沒有length(除非你創建屬性自己),但是你可以用Object.keys(a).length獲得數的屬性(如果你不關心IE < 9,它不實現.keys() - 雖然有polyfill)。

1

因爲您不是將項目添加到數組中,所以您正在創建對象的屬性。

檢查什麼是在Javascript中a.b

1
var a = []; 
a['b'] = a; 

a.length; 
// 0 

a['c'] = c; 
a.length; 
// 0 

陣列只允許數字爲元素的關鍵。

您可以簡單地更改密鑰。或者使用地圖對象而不是數組。

var a = {}; 
a['b'] = a; 
Object.keys(a).length == 1 
0

JS中的數組被認爲是索引數組。即

var arMyArray = []; 

創建索引數組,它可以作爲arMyArray[0], arMyArray[1]

對於關聯數組引用,你將不得不使用對象

var oMyArray = {}; 

創建一個對象,它可以被引用如oMyArray['name'] = 'aliasm2k'

0

你寫的說明a['b'] = a其實等於a.b = a這意味着你c在a上創建一個名爲b的屬性,並將其自身分配給新創建的屬性b,以便結束循環引用:a.b.b.b.b.b.b.b.b...b == a。你可以看看這個,它返回true。

恐怕你可能錯過了數組是可以具有如上所示的屬性的對象。爲了使它像數組一樣行爲,元素的添加方式如a[0] = 1。因爲你創建,而不是添加作爲元素,所以陣列的是空的陣列上添加的對象屬性,這就是爲什麼則爲a.length是0

0

ECMAScript 5.1 Spec

Array對象給予特定類別的財產 名稱的特殊待遇。當且僅當ToString(ToUint32(P))等於P且 ToUint32(P)不等於2^32 - 1時,屬性名稱P(以字符串值的形式)是數組 索引

換句話說,數字屬性名稱被視爲數組索引,非數字屬性名稱不是。

此外,

length屬性的值是數值上比名稱的每個屬性的名字是一個數組索引的 更大。

這意味着即使我有一個元素,長度將取決於該單個元素的數組索引。具體來說,它總是比最大​​的數組索引大1。

例如:

var list = []; 
list[5] = "Hello World"; 
console.log(list.length); // Outputs 6! 

這也被稱爲稀疏數組。如果你是JavaScript新手,會有點奇怪。