2013-10-07 56 views
0

編輯: 刪除了引號。與問題無關。Javascript &&操作員 - 澄清?

問題

爲什麼做它總是(當所有的truthy)主罰最後價值?

實例:

f= 1 && 2 && 3 //3

f= 'k' && 'd' && 's' //'s'

P.S. :我注意到,使用$.callbacks

enter image description here

+5

'&&'操作符應該與布爾操作數一起使用。但是,由於JavaScript允許編寫這種弱類型的色情內容,結果是,令人驚訝:-) –

+0

這是執行的表現,因爲** AND **將在所有條件都正確時返回true。當第一個失敗時,它將停止檢查,因爲如果任何一個錯誤,條件將返回false。所以沒有必要檢查下一個。 –

回答

5

運營商&&充當if語句。僅當值爲假時才發生短路。否則,它會不斷評估報表。

當你寫a && b這意味着:a ? b : a。 同樣,a || b指:a ? a : b

+0

更深入地觀察你的答案 - 它實際上回答了我的問題。因爲這就像一個鏈條。如果'A',然後'B'和(同一回合)如果'B'則C - 這意味着即時通訊還剩下'C'。 –

+0

'||'被深深地用於將默認值賦值給一個變量,如下所示:'setting = setting ||如果用戶未提供任何值(即,「未定義」),則false將分配false。 –

4

編輯調查的pub/sub時:筆者顯著澄清的問題。

JavaScript邏輯AND運算符返回左操作數,如果它是虛假的,否則返回右操作數。 讓我們來看看邏輯真理表:

A  B  A && B 
true true true 
true false false 
false true false 
false false false 

正如你所看到的,如果A是假的,我們可以退貨:

A  A && B 
false false 
false false 

如果A是不假,我們可以回報B:

B  A && B 
true true 
false false 

這是一個小的優化,以弱類型使用時帶來了一些有趣的副作用,如內聯,如果:

var result = callback && callback() 

// Generally equivalent to a simple if: 
if (callback) 
    result = callback(); 
else 
    result = null; 

而且使用默認選項:

name = name || 'John'; 

// Generally equivalent to a simple if: 
if (!name) 
    name = 'John'; 

至於爲什麼會發生,以及,因爲這些運營商defined like that in ECMA-262

+0

問題是關於返回最後一個值 –

+0

@RoyiNamir,我現在已經更新了答案。 – Denis

3

那麼它怎麼總是(當所有的都是真的)取最後一個值?

因爲如果前導值是真的,它不能短路,因爲它是一個「AND」運算符,並且所有操作數必須真實以滿足條件。


重新下方的評論:

是的,但爲什麼它返回的最後一個值?

因爲它很有用。:-)在從Netscape的JavaScript 第一個版本,它只是返回true如果整個表達式的真實,false如果沒有,但幾乎立刻就意識到,這是更爲有用,如果它返回的最終操作。

舉例來說,你可以這樣做:

var value = obj && obj.value; 

...將設置value是無論是falsey值(如果obj是falsey)或obj.value(如果obj不是falsey)。重要的是,如果obj有錯,它不會拋出錯誤。如果你不確定obj是否設置,非常方便。您沒有停止在一個水平上,無論是:

var value = obj && obj.sub && obj.sub.value; 

value要麼是falsey,或者如果兩個objobj.sub是truthy(例如,因爲我們似乎可以用它們作爲對象的obj.sub.value值,他們的對象實例,而不是nullundefined)。

||也做同樣的事情:它返回第一個 truthy操作數。

更多:JavaScript's Curiously Powerful OR Operator (||)

+0

是的,但爲什麼它返回最後一個值? –

+0

@RoyiNamir:對不起,更新。 :-) –

+0

@ T.J.Crowder,如果'&&'實際返回布爾值而不是最後一個操作數,那麼使用if語句的最後一個例子可以正常工作。 – Denis

1

&&logical operator。這測試一個值是否是truthy or falsy。該鏈接文章解釋了,僞造值等於undefined,null,NaN,0,""false

邏輯表達式進行檢查,從左邊到右邊。如果表達式的任何部分被評估爲虛假,則表達式的其餘部分將不會被評估。在你的例子中,價值永遠是真理。在這裏,我們可以打破你的第一個表達式:

f = 1 && 2 && 3; 
f = 1 /* Okay, 1 is a truthy value, lets continue... */ 
f = 2 /* Still truthy, let's continue... */ 
f = 3 /* Still truthy, we've reached the end of the expression, f = 3. */ 

如果有任何前3人falsy的價值觀,表達將結束。爲了表明這一點,只需重新聲明你的變量爲:

f = 1 && 2 && 0 && 3; 

這裏0是一個falsy值(如上所述)。在這裏你表達的執行將結束在0:

f = 1 /* Okay, 1 is a truthy value, lets continue... */ 
f = 2 /* Still truthy, let's continue... */ 
f = 0 /* Hey, this is falsy, lets stop here, f = 0. */ 
f = 3 /* We never get here as the expression has ended */ 

這裏f結束是0。

在你jQuery.Topic()例如,&&用於確保id確實存在:

topic = id && topics[id] 

我們可以以同樣的方式打破下來:

/* Assume this is your topics array: */ 
topics = ["", "My First Topic", "My Second Topic"]; 

/* If we pass in the value 1 as "jQuery.Topic(1)": */ 
topic = id && topics[id] 
topic = 1 /* This is truthy, let's continue... */ 
topic = topics[1] /* topics[1] === "My First Topic" */ 

/* Now lets assume we pass in nothing as "jQuery.Topic()": */ 
topic = id && topics[id] 
topic = null /* This is falsy, let's stop here, topic = null. */ 

以下if語句只會工作如果topic是真的。在第一個示例中,topic的值爲設置爲非空的字符串。在第二個例子中,topic爲空,這是虛假的。

+0

這是一個表達式,而不是一個語句。它也不需要多個操作數,它只是多個'&&'表達式:'1 &&(2 &&(0 && 3))'。 – Denis

1

因爲如果第一個是真的,那麼它應該繼續並檢查第二個操作數直到最後一個。如果你想用1 ||去2 || 3代替它將返回1.

+0

這並不能解釋返回最後一個值的行爲 –

+0

https://www.google.ru/search?q=douglas+crockford+javascript+the+good+parts&oq=douglas+crockford+&aqs=chrome.2.69i57j0l5。 10056j0j7&的SourceID =鉻&espvd = 210&es_sm = 93&即= UTF-8 –

0

短路評估和返回第二個表達式而不是bool是非常有用的功能。

&&運算符評估左操作數,以及它是否真正評估右操作數。類似地,||運算符評估左操作數,如果它是虛假的,則評估右操作數。

這允許寫之類的東西

draw_element(color || "#F00"); 

使用color除非如果未指定它(例如colornullundefined"")的含義和在這種情況下,使用默認值。

你甚至可以使用之類的東西

draw_element(color || pick_new_color()); 

且僅當未指定顏色的功能pick_new_color()將被調用。

&&一個非常普遍的使用,而不是爲避免錯誤,e.g:

if (x && x.constructor == Array) { 
    ... 
} 

因爲如果xnullundefined你不能訪問屬性(如果你嘗試一個異常將被上升)。事實上,&&返回第一個結果,如果它是falsy而不是僅僅false確實沒有那麼有用。你的代碼示例是這樣做的,但這不是你在JavaScript程序中經常會發現的東西。

回顧:&&||是短路的(即,如果在評估第一個操作數後知道結果,它們甚至不評估第二個操作數),這非常有用。他們還會返回falsy/truthy值本身而不是bool,這對於||(對於&&沒有太大的幫助)非常有用。

1

ECMAScript標準規定12.11.2 Runtime Semantics: Evaluation

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression 

1. Let lref be the result of evaluating LogicalANDExpression. 
2. Let lval be GetValue(lref). 
3. Let lbool be ToBoolean(lval). 
4. ReturnIfAbrupt(lbool). 
5. If lbool is false, return lval. 
6. Let rref be the result of evaluating BitwiseORExpression. 
7. Return GetValue(rref). 

也就是說,首先我們要檢查第一個操作數是否被評估爲 「falsy」 值(nullfalse0)。如果是,則返回第一個操作數。

但是,如果它是「完整的」,那麼對第二個操作數重複相同的過程,如果它被評估爲真值,則返回原始值(7. Return GetValue(rref))。