2015-01-13 32 views
0

我一直在爲大概六個月左右的工作角度,所以一直在使用JSON和JavaScript中的對象工作很多。我遇到的這種情況一直令人沮喪,我不明白這個推理。也許這是我對JS的缺乏經驗,所以我不知道推理,或者我只是做錯了,但我會很感激任何洞察。爲什麼JS需要對象/數組存在

實例對象:

var data = 
    { 
    "object": 
     { 
     "Key":"Value", 
     "stuff":"here" 
     }, 
     "array": 
     [ 
      { 
      "Name":"Pizza Face", 
      "id":7 
      }, 
      { 
      "Name":"Maple bar", 
      "id":1 
      } 
     ] 
    } 

所以,讓我們說,我想給一個對象添加到陣列中。很簡單,對吧?但是,假設我想在數組存在之前將對象添加到數組中。以上方法出錯說出Cannot read property 'push' of undefined。相反,我必須在它周圍包裝一個條件。

var newObject = {"Name": "Master Sword", "id":2} 
    if(data.array){ 
    data.array.push(newObject); 
    } 
    else{ 
    data.array = []; 
    data.array.push(newObject); 
    } 

我可以隨時將新對象添加到data。然而,我應該嘗試在對象內添加一個對象。

例子:

data.newObject = {"Name": "Master Sword", "id":2} 

NEWOBJECT會在這種情況下被創建和大家都高興。

data.newObject.Name = "Master Sword" 

失敗! Cannot set property 'Name' of undefined

所以...爲什麼JS不是隻用創建的鍵值對創建newObject?或者當我嘗試推送到不存在的數組時,爲什麼不創建數組而不是錯誤?

我想澄清一下,雖然這對我來說是令人沮喪的,但是我的這個問題的目的不是爲了抱怨。這是要問我是否做錯了。在嘗試添加對象/數組之前,是否真的需要一個條件來檢查對象/數組是否存在?有一個更好的方法嗎?

+6

這只是JavaScript的工作方式。您必須先定義一個對象,然後才能設置該對象的屬性。你會發現許多編程語言都是這樣的... – colti

+0

「我想在數組存在之前將對象添加到數組中」。如果該數組不存在,那麼您可以添加什麼?我想你已經回答了你自己的問題。 – Andy

+0

@colti所以正在創建條件檢查,看看這些數組/對象是否存在最好的/唯一的方法來做到這一點? – Aarmora

回答

2

您正試圖通過chaining創建對象。這個問題除了鏈中的最後一部分之外,所有以前的部分必須已經定義好了。JavascriptObjects

a.b.c.d = new Object(); // a,b,c must be already defined, cannot have cascading here 

所以,當你說data.newObject.Name = "Master Sword";,該newObject應該已經提前定義(你已經有了一個data對象我假設)。這是它的工作方式(可能在每種語言中至少遵循一些語義)。爲了解決這樣的問題,你總是可以創建一個新的通用對象說:

var myComplexObject = function() { //add all reusable object constructors here }; 

填充您的複雜的對象,你喜歡的任何方式,例如在此constructor中創建一個新的空對象並將Prototypes添加到此構造函數以擴展功能。寫一次,然後永遠循環。您可以建立一個適合您需求的圖書館。這是應該如何做的。

P.S .:可能對於您可以封裝在try{}catch(e){}塊中的檢查部分。

+0

很好的解釋和選擇,謝謝。 – Aarmora

1

方法push位於javascript Array對象上,不出所料,該方法在nullundefined上都不起作用。幾乎所有的編程語言都是一樣的。

當調用data.newObject = {"Name": "Master Sword", "id":2}時,您完全可以將屬性設置爲新對象,這與上述情況非常不同。

0

這是因爲當你試圖引用一個對象的鍵時,如果該鍵不存在,那麼該鍵將被創建,並且未定義的值將被分配給它。未定義只是一個JS值類型。如果你想檢查「未定義」不是錯誤,只需注意「未定義」在控制檯上用灰色書寫。 (錯誤有紅色)。

如果您將一個對象分配給其他對象的某個鍵,並且想要爲其添加屬性,那麼這根本不會代表問題。

但是,如果您嘗試將屬性添加到可用未定義值初始化的鍵,那麼您將收到錯誤消息是合理的。記住,JS允許你在對象上存儲你想要的任何值類型。

我建議你多讀一點關於對象,以及JavaScript中未定義的值。

希望它有幫助。

相關問題