2016-01-22 67 views
14

假設JavaScript數組發佈在表單中(使用ajax/JQuery) 是否保證數組中的順序?JavaScript數組的順序是否有保證?

從@Quentin 有效的問題「定義‘張貼在形式’」

$.ajax({ 
    type: "POST", 
    url: url, 
    data: { foo: [{ name: "one" }, { name: "two" }] }, 
    success: success, 
    dataType: dataType 
}); 

擴展上的問題(由於上述), 是保證保存在服務器側的順序排列?

+8

數組是有序集合。 – MinusFour

+0

爲什麼你會認爲數組順序不會被保留?據我所知,只有對象屬性順序不能保證。 – Xufox

+0

我遇到過訂單未被保存(使用其他語言)的情況,因此提出了問題。 – Dementic

回答

17

你總是可以參考ECMAScript標準時的疑惑:Array Exotic Objects

陣列是一種特殊的語言中的對象,它有length屬性是如何處理對於那些從0整數屬性的其他語義到2^32。在JavaScript中,如果在0到長度屬性排除的範圍內有缺失值,則數組可能很稀疏。各種陣列方法考慮到這一點,例如forEach忽略缺失值

什麼是缺失值?

該語言試圖使數組儘可能地像普通對象一樣工作:您可以向其添加任何屬性,甚至可以擁有從數組繼承的對象。

var fruits = ["Apple", "Banana"]; 
fruits.preferred = "Apple"; 

這種代碼不會造成任何問題,但如果你開始寫:

fruits[100] = "Strawberry"; 
for(let i = 0; i < fruits.length; ++i) { 
... 
} 

100是在範圍內的屬性名稱[0,2^32),所以是一個數組元素,但在這一點上fruits.length應該是什麼?它必須是101,否則for循環永遠不會得到「草莓」。

但是在這一點上,您必須接受有一系列從未定義的元素[2,99]:這些元素是缺失的值。

反之亦然,當你修改length屬性

var fruits = ["Apple", "Banana"]; 
fruits.length = 0; 

現在for循環將永遠不會在陣列中的任何元素同樣必須是真實的:這相當於排空水果陣列。

也有可能來增加長度,具有缺失值

的結果

所以是數組是有序的,你可以重複其在提高訂單的所有元素,但請記住,可能有遺漏值

+1

你可以擴展'缺失值'嗎? – Dementic

+0

擴大了一點,希望是明確的 –

+0

謝謝,這與我評論過的博文相似,但非常確定其他人會發現這個有用的。 – Dementic

相關問題