2011-04-28 103 views

回答

7

他們是相似的,但不完全相同。如果選擇x,則x ? x : y最終評估x兩次。如果x是函數調用,這可能會導致意想不到的效果。

您可以在ECMA specification找到正式的證明。

另一種方式來證明這一點:

function a() { c++; return true; } 
function b() { d++; return true; } 
var c = 0, d = 0; 
a() || 3; 
b() ? b() : 3; 
/* c is 1; d is 2 */ 
-3

取決於您想要實現的目標。如果您正在處理字符串,例如(x || y)轉換爲「如果字符串x不爲空/空或字符串y不爲空/空」,則返回1/true,而(x ? x : y)轉換爲「ifstring x不爲null /空,則返回x,否則返回x (如果它是空的/ null)返回y「。 所以第一種方法將總是返回一個布爾值1/0或true/false,而第二種方法將返回2個變量的實際值之一。 話雖如此,如果您想在另一個if(z)中使用結果(z),那麼它們是等效的。

+0

不,這是錯誤的。 'x ||如果不是虛假的,則返回'x',否則返回'y'。 – 2011-04-28 11:10:37

2

ECMAScript language specification,第83頁:

生產LogicalORExpression:LogicalORExpression || LogicalANDExpression的計算方法如下:

  1. 設lref是評估LogicalORExpression的結果。
  2. 讓lval成爲GetValue(lref)。
  3. 如果ToBoolean(lval)爲true,則返回lval。
  4. 讓rref是評估LogicalANDExpression的結果。
  5. 返回GetValue(rref)。

所以||返回變量的值,而不是操作的布爾結果。該值由if (...)語句轉換爲布爾值。

+0

順便說一句,在同一頁面上,您可以找到(?:)運算符的描述並比較它們的工作方式。 – 2011-04-28 11:15:10

1

這兩個表達式在JavaScript等效的,因爲邏輯「或」運算符返回的第一個元素,如果是「真」或第二否則。

然而,你應該小心的值是true,什麼都考慮,而不是假的,因爲這是從其他動態類型語言的不同是什麼?例如兩者""0是JavaScript和Python的假,但[]是假的Python,但對Javascript真實。 在常見的Lisp中,所有的都被認爲是「真」(包括0""或一個空數組),只有NIL被認爲是錯誤的例外(但是NIL也是「空列表」)。

非常有用的是undefined被認爲是「虛假」的JavaScript中,因爲這允許例如寫這樣obj.redraw && obj.redraw();代碼,將調用只有當它的存在,並且否則無爲redraw方法(函數/方法是「真」爲Javascript)。

如果有xy代替你不是說實際變量,但表情那麼這兩個是不等價的,因爲x在「三元運算符」版本(在第一次評估,如果「真」)進行兩次評估,只一次在「邏輯」或「版本」中。如果x是函數調用,這會有所不同。

如果你想強制一個值爲其布爾結果的Javascript最常見的成語可能是!!x總是truefalse