2016-02-08 25 views
-8

下面的javascript代碼正在給undefined做最後的輸出。但據我所知OR'|| 「運營商一旦得到」真實「就會停止評估。但是在這段代碼中,它試圖評估其餘條件,即使它在第一個表達式上成立。這個javascript短路分配問題是什麼

field = { 
    ipaddr: "0.0.0.0", 
    nodePresentInTopo: false 
} 

var bestName = field.ipaddr || (field.ip6addr && field.ip6addr != '::') ? field.ip6addr : undefined || field.sysid; 

here bestName always evalueavtes to undefined but why?因爲它正在獲得field.ipaddr的值,即0.0.0.0

請解釋邏輯。

+0

我可能是錯的,但我想? :除非把它放在括號中,否則吞下整個表達式() – HopefullyHelpful

+2

結果可以是'field.ip6addr','undefined'或'field.sysid',**所有這些都是'undefined' ** – deceze

+0

問題尋求調試幫助(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 (http://stackoverflow.com/help/mcve) –

回答

0

我假設你知道你寫了field.ipaddr而不是fields.ipaddr。可能用於測試目的。如果表達式的最後一部分是你的問題,寫出來就像這樣:

(undefined || fields.sysid);

+0

糾正了錯字錯誤。它仍然給出相同的答案「undefined」 – Vishal

0

我不認爲這樣是有與當前的對象名ip6addr任何財產?

var bestName = (field.ipaddr || (field.ip6addr && field.ip6addr != '::') ? field.ipaddr : undefined || field.sysid); 
undefined 

要麼你應該在當前對象添加ip6addr或相應的屬性

+0

沒有在這種情況下ip6addr屬性,但它可以爲其他情況下,這是一個大插件的一部分,我剛剛複製了它的一部分 – Vishal

+0

請console.log(字段)和檢查此屬性是否屬於您的字段對象的一部分,就在您的輪換操作員之前 –

1

取代一句話:operator precedence.

是,||短路和不評估的下半年表達式用作三元運算符中的條件。

field.ipaddr || (field.ip6addr && field.ip6addr != '::') ? .. : .. 

則計算結果爲:

'0.0.0.0' ? .. : .. 

計算結果爲true,然後計算三元運算符的true分支:

field.ip6addr 

如果你想使用不同的邏輯分組,使用括號:

field.ipaddr || (.. ? .. : ..); 
+0

This Works thanks,thanks! – Vishal

+0

你還可以解釋爲什麼它試圖評估三元運算符的真正分支 – Vishal

+1

因爲這是邏輯分組由於[**運算符優先級。**]如何擺出(https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)您的整個ipaddr || (ip6addr ..)'表達式被視爲*條件*給三元運算符。因爲'||'的優先級高於'::'。 – deceze