2013-06-27 56 views
2

作爲每description of the Object.keys on MDNObject.keys(obj)是如何工作的?

Object.keys返回一個數組,其元素是對應於枚舉的屬性的字符串直接發現在對象。 屬性的排序與通過手動循環對象屬性的順序相同。

它包括下面的例子:

// array like object with random key ordering 
var an_obj = { 100: "a", 2: "b", 7: "c"}; 

alert(Object.keys(an_obj)); // will alert "2, 7, 100" 

但是作爲每定義,關鍵應印在它們已經被插入到對象的順序100, 2, 7,代替2, 7, 100

請讓我知道,怎麼關鍵的排序中Object.key發生。

+3

您是否嘗試過 「遍歷手動對象的屬性」,以確認你的理論,你會得到他們按照'100,2,7'而不是'2,7,100'的順序? – ruakh

+1

「根據定義」 - 什麼定義?上面的那個?它沒有提到插入順序。 –

+0

與其他HashTable/Dictionary結構一樣,JavaScript對象的鍵是無序的。如果你想維護秩序,你需要使用一個數組或類似的結構。 –

回答

5

我想你可能誤會了這一點:

屬性的順序是一樣的,通過遍歷對象的手動特性給出。

這意味着Object.keys中的屬性順序與您執行for-in循環時的順序相同。

比較這些結果:

var an_obj = { 100: "a", 2: "b", 7: "c"}; 

//using object.keys... 
console.log(Object.keys(an_obj)); 

//using a manual loop... 
for(var k in an_obj) { console.log(k); } 

你會發現,爲了讓這兩個是一樣的。

+0

+1「手動」對MDN來說是一個不好的術語。有不同的手動循環方式。他們應該特別說明「for-in」。 –

+0

@CrazyTrain它是一個wiki。隨意編輯 –

+0

@JanDvorak:不,我不編輯MDN。正確的信息不斷被不正確的信息所取代。這是不值得的時間。 –

3

JavaScript對象是無序的鍵 - 值對。 Object.keys按照它們在迭代它們時返回的順序返回對象鍵的數組,但它不保證結果順序與插入順序有關。

0

我解釋一點關於它們之間的區別:

Object.keys(obj) 

 

for(var key in obj){ 
    console.log(key); 
} 

相似度:

在相同的順序都返回鍵。這些之間沒有任何區別。

說明:

  1. 如果你在你的對象數字鍵然後

    • 所有的數字鍵來在自然順序。
    • 所有其他鍵都按插入順序排列。
  2. 如果對象不包含任何數字鍵,則插入順序將跟隨兩個技巧。

例子:

var sec_obj = {0:"0", "d":23, "r": "a", "a": "b", "7": "c","z":23, 23:23}; 

//using object.keys... 
console.log(Object.keys(sec_obj)); 

//using a manual loop... 
for(var k in sec_obj) { console.log(k); } 

結果

["0", "7", "23", "d", "r", "a", "z"] 
0 
7 
23 
d 
r 
a 
z