2014-02-11 45 views
0

我碰到過一個不尋常的JS問題。Javascript對象的值在定義時顯示爲NaN

JS小提琴:http://jsfiddle.net/RD5a4/

注意,小提琴不會產生任何結果,只是控制檯日誌。

引擎收錄:http://pastebin.com/raw.php?i=AcH79zZv

我試圖創建一個計時器和我有一個是這樣定義的對象(代碼修剪易讀性):

initiate_timer : function(options) { 
timer = { 
    id: options.id || "ticker", 
    to_display: options.to_display || ['days', 'hours', 'minutes', 'seconds'], 
    target_date: options.target_date || null, 
    time_left: { 
     in_days : "0", 
     in_hours : "0", 
     in_minutes : "0", 
     in_seconds : "0" 
     } 
    } 
} 

再往下我計算剩餘時間和將其分成幾天/小時/分鐘/秒,以便我可以顯示它。當我將對象,計時器顯示到控制檯時,time_left正確顯示。

console.log(timer); 
Object { 
    time_left: Object { 
    in_days: "00" 
    in_hours: "00" 
    in_minutes: 45 
    in_seconds: 54 
    } 
} 

但是,如果我嘗試直接訪問time_left,我突然只能得到NaN。

console.log(timer.time_left); 
Object { 
    in_days: NaN, 
    in_hours: NaN, 
    in_minutes: NaN, 
    in_seconds: NaN 
} 

任何想法?請讓我知道我是否可以澄清任何事情,因爲這肯定是一個令人困惑的問題。

在此先感謝

+4

我懷疑是異步的錯誤,或延遲​​數呈現出了問題,但我們不」沒有足夠的代碼。你能在小提琴中重現這個問題嗎? –

+0

謝謝@dystroy,我已經添加鏈接到一個JSFiddle產生的問題。還有JS的pastebin(是否有更好的方法)。兩個console.log行緊挨在一起,這是令人困惑的部分 – raydeneg

回答

0

什麼情況是,在記錄的時候,你的對象還沒有完全初始化,並充滿了NaN

但是,出於性能原因,控制檯中的渲染不是立即的(除了通常用於第一級屬性):稍後完成時,當您在控制檯中打開對象時(請記住,記錄的對象是潛在的非常大或者甚至是循環的,所以瀏覽器幾乎不能預先計算整個三者)。

真正看到在登記時間的對象的方式(假設它不是太大或環狀的)是使用

console.log(JSON.stringify(timer)); 
+0

注意:如果您必須記錄非常大或循環的對象(不能'stringify'),那麼您可以使用我製作的庫: [JSON.prune](https://github.com/Canop/JSON.prune)。 –

+0

感謝您的回覆。雖然這可能是準確的,但實際上並沒有解決問題(我可能沒有正確描述)。我還無法使用剩餘的timer.time_left.days訪問該對象。這不僅僅是一個日誌問題。我能夠重寫代碼來解決問題,但我仍然不知道爲什麼這種方式不起作用。 – raydeneg