2016-01-08 16 views

回答

9

陣列的length是反射性的最大數組索引存在於陣列中的。 「數組索引」(參見下文)是一個屬性名稱,它的整數值小於2 -1。由於3.4不是整數,因此設置它不會改變length

數組是數據對象,所以沒有理由爲什麼數組不能有一個名爲3.4的屬性,但該屬性不會影響length,因爲它的名稱不符合數組索引的條件。

ES2015 9.4.2, Array Exotic Objects定義 「陣列指數」 爲一個整數小於2 -1:

屬性名稱P(在一個字符串值的形式)是一個數組索引當且僅當的ToString(ToUint32(P))等於P和ToUint32(P)不等於2 -1「。

這定義是相對於用於將length值(重點煤礦):

每個數組對象都有一個length屬性,其值始終是一個非負整數小於2 。 length屬性的值在數值上大於名稱爲數組索引的每個屬性的名稱;無論何時創建或更改Array對象的屬性,必要時都會調整其他屬性以保持此不變。具體而言,每當自身屬性添加其名稱是一個數組索引,length屬性的值被改變,如果必要的話,爲比數組索引的數值一個更多...

+0

'length'反映了最大的數組索引,而不是最大的整數索引。例如,Object.assign([],{[1e53]:1})。length === 0',但是Object.assign([],{[99]:1})。length === 100 ' – Oriol

+0

@Oriol是的,我試圖在答案的第二部分說清楚,但我同意第一句話無可辯駁地不正確。我想要溝通「如果一個鍵不是一個整數,那麼它不適合數組索引的定義」,但我沒有那麼做。我希望我的編輯更好。 – apsillers

0

您必須使用整數作爲索引,而不是浮點數。

var arr = []; arr[3] = 1; console.log(arr.length);

2

JavaScript數組不能有分數索引。

你在那裏做了什麼在數組對象上被賦予一個名爲"3.4"的屬性。

這不會影響length屬性,該屬性旨在返回比最高有效索引更高的一個數字。

如果你想到數組應該如何工作,你應該意識到小數偏移是沒有意義的。

0

你可以嘗試使用一個對象與數組。

var arr = {}; 
arr[3.4] = 1; 
arr[3.5] = 2; 
arr[3.6] = 3; 
console.log(Object.keys(arr).length); 
相關問題