2015-11-05 49 views
3

我學習JavaScript和閱讀有關如何初始化對象的教程後,我發現下面的例子:使用數字作爲JavaScript對象初始化中的屬性有什麼好處?

var obj = { property_1: value_1, // property_# may be an identifier... 
         2: value_2, // or a number... 
            // ..., 
      "property n": value_n }; // or a string 

我懷疑是在用數字作爲名稱的屬性。我明白這一點,但我找不到使用它的真正好處。我讀this question,從我的角度來看,這種表示法可能會導致設計不良或者代碼中出現不必要的複雜性,所以我想知道爲什麼會存在這種語法。

這種聲明是否經常使用?在什麼樣的情況下,這可能是一個理想的選擇?

+4

沒有特別的好處。它看起來像這樣編寫代碼只是爲了演示對象文本中不同的有效屬性名稱。 –

+3

這是非常糟糕的代碼,通常由不知道數組是誰的人編寫。像火一樣從它運行。可悲的是,它使用得非常頻繁。 –

+6

在任何需要使用ID作爲密鑰的HashMap功能的情況下,它的用處 – xjedam

回答

1

陣列

JavaScript數組是一些鍵是整數(*)的對象。

[9, 8, 7]類似於對象{ 0: 9, 1: 8, 2: 7 }

主要區別在於該陣列的原型爲Array.prototype而不是Object.prototype。 (*)正如Benjamin Gruenbaum所指出的那樣,數組鍵是強制UInt32的。對象的鍵總是字符串或符號。正如djechlin指出的那樣,數組可以具有任何類型的鍵的屬性,但我不建議在數組中添加您自己的非整數鍵。

參數

類似陣列的對象稱爲arguments是任何功能(*)內可用。函數接收到的每個參數都是arguments上的一個屬性,它帶有一個類似整數的鍵。

在以下代碼中,example調用返回對象,如{ 0: 9, 1: 8, 2: 7, length: 3 }

function example(a, b, c) { 
    return arguments; 
} 
example(9, 8, 7); 

(*)In modern JavaScript, there is no arguments object in arrow functions.

+4

*密鑰強制轉換爲UInt32。對象的鍵總是字符串或符號。 –

+3

'var foo = []; foo.chicken ='chicken'' - 鍵不一定是整數。 – djechlin

+0

對象當然可以擁有「長度」屬性。 – djechlin

0

即代碼做作,使點。但是,既然你問了一個可以使用的例子,讓我給你一對夫婦。

  • 它可以發生,如果您收到JSON格式的數據就會像 這一點。取決於外部系統的細節。

  • 另一個可能是爲了一致性。例如。假設您有一個數據模型 ,您可以從中生成HTML。它可能是使用 對象作爲每個字段的可能值(假設字段 只能取一個可能的值)。這些字段 然後可以呈現爲單選按鈕或選擇。這些字段中的一些將使用字符串作爲可能的值,所以自然而然的做法是將可能的值列表放入一個對象中。但有些 將使用整數鍵 - 仍然可能更好地堅持列表 總是一個對象。

例如,

var prio_field_pos_vals = { 
    0: 'Show Stopper', 
    1: 'Urgent', 
    2: 'High', 
    3: 'Low' 
} 

當然,這可能不會被定義爲獨立變量,而是作爲模型的一部分,但您明白了。我會避免使用整數鍵(和字符串中帶空格的鍵),除非你有理由爲它們,但當你有一個原因,使用它們。

+0

當然JSON將總是圍繞鍵引號,所以'{「0」:「...」,...}' – Bergi

+0

無序對象可能不是最適合單選按鈕列表的。 「{value:...,text:...,...}」記錄數組可能是更好的想法 – Bergi

+0

是的,如果它以JSON數據形式出現(大多數情況下)會引用引號。取決於它是如何產生的。據我所知,這兩種方法在JavaScript中都是有效的。 – Adam

1

使用整數作爲對象密鑰創建時稀疏數組和矩陣,例如映射1000元素矢量與0到處除了第十元件作爲

v = {10: 1} 

數組不能在此處使用JS因爲你需要是有用能夠使用鍵指定元素位置。

在ECMAscript 6中使用[Map]1更好,因爲它實際上是一種映射,但是在基於舊ES標準的代碼庫中,您可能仍然會看到用於這些映射的對象。

+0

那麼你可以使用稀疏數組,但我想你的意思是序列化,對吧? '[,,,,,,,,, 1]'不是超級性感 – Bergi

+0

我更想到如果你想實現一個稀疏矩陣乘法函數。如果使用稀疏數組並將每個元素乘以3,它仍會嘗試對未分配的元素執行乘法。 –

+1

那麼,如果你需要稀疏迭代,那麼你可以在數組中使用'for in'循環(或者'Object.keys')。但是,是的,稀疏數組和整數鍵控對象之間的差異可以忽略不計 – Bergi

相關問題