2017-07-03 103 views
6

從這個問題:What does "var FOO = FOO || {}" (assign a variable or an empty object to that variable) mean in Javascript?var FOO = FOO ||如何? Javascript中的成語工作?

我瞭解到,var FOO = FOO || {}基本上意味着「foo是否存在,然後離開它不變,否則讓它空對象」。

但是如何?

這是我怎麼會解析此語法:

var FOO = (FOO || {})

所以:如果FOO存在和計算結果爲真布爾值,然後(FOO || {})就返回true,因此最終FOO將會完全覆蓋和意志從現在開始保持布爾值爲True。

否則(FOO || {})將返回任何布爾值{} evalueates to。由於空的對象,這是{},結果始終爲true ...

那麼無論如何(FOO || {})應該評估爲True,所以......

在任何可能的CASE,評估var FOO = FOO || {}後,FOO應持無論之前持有的是True的平凡布爾值。基本上,據我的理解,var FOO = FOO || {}應該相當於var FOO = True

我的錯誤在哪裏?

+3

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators – evolutionxbox

+2

與其他語言不同,JavaScript布爾表達式不一定返回布爾值。只需運行console.log('foo'||'bar')'在控制檯中。 –

回答

0

所以:如果FOO存在和計算結果爲真,那麼布爾值(FOO || {})將返回True

概念的問題是演員。這裏的對象不會轉換爲布爾值,JS不會改變它。

所以,如果FOO定義(FOO || {})將返回FOO,如果沒有定義將返回{}

+0

最後在你的回答是提問者的第二行:) –

10

foo是否存在及計算結果爲真,那麼布爾值(FOO || {})將返回True

這不是如何||運算符在JS中工作。

正確的解釋是:

如果左手側是真值,作爲評價的左手側(即FOO),否則評估爲右手側(即{})。

var zero = 0; 
 
var one = 1; 
 
var two = 2; 
 

 
console.log(zero || two); 
 
console.log(one || two);

6

所以:如果FOO存在和計算結果爲真,那麼布爾值(FOO || {})將返回True,所以最終FOO將完全覆蓋,將舉行從現在開始True的布爾值。

這是不對的,但下面的行會讓你大吃一驚,如果你的背景是嚴格的類型語言:)

表達不返回一個布爾值。它將可以評估的表達式返回爲true。

這裏是docs對於相同

返回expr1的,如果它可以被轉化爲true;否則,返回expr2。因此,當與布爾值一起使用時,||如果任一操作數爲真,則返回true;如果兩者都是假的,則返回false。

邏輯運算符通常與布爾(邏輯)值一起使用。當它們是時,它們返回一個布爾值。然而,& &和||運算符實際上會返回其中一個指定操作數的值,因此如果這些運算符與非布爾值一起使用,則它們可能會返回非布爾值。

文檔中給出的不同示例可能有助於您理解上述單詞。

o4 = false || (3 == 4) // f || f returns false 
o5 = 'Cat' || 'Dog'  // t || t returns "Cat" 
o6 = false || 'Cat'  // f || t returns "Cat" 
o7 = 'Cat' || false  // t || f returns "Cat" 
o8 = '' || false  // returns false 
3

JavaScript ||運算符返回表達式本身不是布爾值。以下是來自Mozilla文檔的參考文獻

如果可以將其轉換爲true,則返回expr1;否則,返回 expr2。因此,當與布爾值一起使用時,||如果 操作數爲真,則返回true。

Reference :

轉換到True布爾依賴於表達是否評估爲Truthy值。

0

這是因爲短路評估。

短路評價說,第二個參數被執行或評估僅當第一參數不足以確定表達式的值:當所述的第一個參數AND(& &)函數的計算結果爲假,則總體價值必須是假的;當OR(||)函數的第一個參數計算結果爲true時,整體值必須爲真。

但是,如果AND函數的第一個參數的計算結果爲true,則必須執行或計算第二個參數以確定表達式的值;當OR函數的第一個參數的計算結果爲false時,必須執行或計算第二個參數以確定表達式的值。

在FOO ||的情況下, {};

  1. 如果FOO計算結果爲TRUE,則返回FOO,因爲如果第一個參數爲true,則不需要評估第二個參數。
  2. 如果FOO計算結果爲FALSE,則返回{},因爲需要評估第二個參數以獲取表達式的值。

See here for more details.

+1

請[只避免鏈接只回答](http://meta.stackoverflow.com/tags/link-only-answers/info)。 「幾乎不超過鏈接到外部網站的答案」[可能會被刪除](http://stackoverflow.com/help/deleted-answers)。 – Quentin

相關問題