2012-01-18 55 views
2

我需要用存儲在此對象中的值替換imagesrc。然而,當我運行:如果變量未定義,防止出現錯誤?

if(data['results'][res]['entities']['media']["0"]["media_url"]) { 
    imagesrc = data['results'][res]['entities']['media']["0"]["media_url"]; 
} 

我得到的錯誤:

Cannot read property '0' of undefined 

如何運行我的條件,使我不明白的錯誤,如果事情是不明確?

+0

檢查它是否是第一個未定義的:http://stackoverflow.com/questions/776950/javascript-undefined-undefined – 2012-01-18 19:42:24

+0

你有沒有考慮過使用try..catch? – Li0liQ 2012-01-18 19:42:33

回答

2
if (data['results'][res]['entities']['media']["0"] == undefined 
    || data['results'][res]['entities']['media']["0"] == null) { 

    ... 
} 
+0

你不需要'...... == undefined || ... == null'。只要做一個或另一個,因爲'=='在兩種情況下都會返回'true'。 – 2012-01-18 19:45:45

2

您可以將代碼放入try catch區塊並檢查錯誤消息。

0

你可以寫,它遍歷對象樹,因爲它擊中一個未定義的屬性儘快返回undefined功能:

function safeGetData(obj, names) 
{ 
    for (var i = 0; i < names.length; ++i) { 
     if (typeof obj === "undefined") { 
      return undefined; 
     } 
     obj = obj[names[i]]; 
    } 
    return obj; 
} 

您可以使用它像這樣:

var imagesrc = safeGetData(data, 
    ["results", res, "entities", "media", "0", "media_url"]); 
0

我知道這是一個老話題。這只是添加我的2美分。 我絕對不是一個javascript「大師」,但這是我以前的一次嘗試。它依賴於一些新的ECMAScript 6個特性和它將會在一個更加「實用」的方式來解決這個問題:

const prop = (...arr) => obj => arr.reduce((acc, v) => acc && acc.hasOwnProperty(v) ? acc[v] : undefined, obj) 

而且爲了一些測試,以顯示它如何工作:

describe('unit - prop',() => { 
    const event = { 
      record: { 
       sns: { 
        subject: 'Hello', 
        message: '<div>Welcome!</div>' 
       } 
      } 
     } 

    it('property exists', done => { 
     const value = prop('record', 'sns', 'subject')(event) 
     expect(value) 
      .to 
      .be 
      .equal('Hello') 
     done() 
    }) 

    it('property does not exist', done => { 
     const value = prop('record', 'bad', 'subject')(event) 
     expect(value) 
      .to 
      .be 
      .undefined 
     done() 
    }) 
}) 

它有道理嗎?