2016-11-20 28 views
0

過了一會兒寫javascript我總是有這個問題。我總是要檢查變量存在,然後才能使用它的屬性,否則我會得到一個錯誤。如下面的代碼JavaScript使用財產安全,沒有得到錯誤

if (something) { 
    var data = { 
    date: moment() 
    }; 

} 

var x = new F({ 
    param: param, 
    date: data.date || null //<-- still error 
}) 

其中一些變量可能存在或不是,那我肯定不能使用date.date。我必須創建一個新變量來解決這個問題。像

if(data){ date = data.date } 但是有沒有更短的解決方案?

+0

date:(data || {})。date || null // < - 沒有錯誤。但看起來不好:D。 –

+0

是的,這是一個問題,但你讓它比它所需要的更困難。而不是僅僅有時實例化'data',只是經常做,如果條件通過,添加屬性。這樣你就不需要防止'數據'被'未定義',你只關心它有或沒有的屬性。事實上,你不需要'|| null「,因爲如果沒有'date'屬性,你只需要'undefined'。 – vlaz

回答

0

發生這種情況是因爲當something的計算結果爲false時,可變數據未被定義。在這種情況下,當您嘗試訪問屬性date時,您會收到參考錯誤。解決的辦法是要初始化的數據變量爲空對象:

var data = {}; 

if (something) { 
    data.date = moment(); 
} 

var x = new F({ 
    param: param, 
    // now data is defined, so we can safely check if the date property exists on it: 
    date: data.date || null 
}) 

注意,當你真正初始化數據{},防止TypeErrors試圖在除對象以外的其他類型的訪問屬性時,此方法只適用。

+0

'當你嘗試訪問屬性日期時,你會得到一個引用錯誤.'它是TypeError - 'date'將是'undefined'。 – vlaz

+0

你確定嗎?我非常確信,當您嘗試使用點符號訪問屬性時,該腳本將會打破參考錯誤: '未捕獲的ReferenceError:數據未定義。當數據被定義時發生typeError,但不是'Object'類型,而是'null',然後嘗試訪問它上面的屬性。它會說: '未捕獲的類型錯誤:無法讀取'空'的屬性'日期' –

+0

如果您從不聲明數據,就會發生這種情況。但是,由於你有'var data',聲明將被懸掛在函數的頂部(並且在'if'之外),所以'data'將會被聲明,但是會有'undefined'的值。 – vlaz