在控制檯上,我試圖創建一個循環數組,我相信如果試圖遍歷它會導致堆棧溢出,但我甚至無法得到它的長度。爲什麼這會返回0的長度?
var a = [];
a['b'] = a;
a.length;
// 0
a['c'] = c;
a.length;
// 0
在控制檯上,我試圖創建一個循環數組,我相信如果試圖遍歷它會導致堆棧溢出,但我甚至無法得到它的長度。爲什麼這會返回0的長度?
var a = [];
a['b'] = a;
a.length;
// 0
a['c'] = c;
a.length;
// 0
它有一個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)。
因爲您不是將項目添加到數組中,所以您正在創建對象的屬性。
檢查什麼是在Javascript中a.b
var a = [];
a['b'] = a;
a.length;
// 0
a['c'] = c;
a.length;
// 0
陣列只允許數字爲元素的關鍵。
您可以簡單地更改密鑰。或者使用地圖對象而不是數組。
var a = {};
a['b'] = a;
Object.keys(a).length == 1
JS中的數組被認爲是索引數組。即
var arMyArray = [];
創建索引數組,它可以作爲arMyArray[0], arMyArray[1]
等
對於關聯數組引用,你將不得不使用對象
var oMyArray = {};
創建一個對象,它可以被引用如oMyArray['name'] = 'aliasm2k'
等
你寫的說明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
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新手,會有點奇怪。
第一個相關鏈接很好地解釋了這個問題:http://stackoverflow.com/questions/5223/length-of-javascript-object-ie-associative-array?rq=1 –
'a ['b']'assigns屬性'b'來反對'a'。無論什麼類型的「a」都沒關係。 – cgTag