在JavaScript中,對於所有類型的變量(例如string,function,...),我總是可以使用布爾邏輯或代替條件運算符嗎?JavaScript:有條件(三元)vs布爾OR對於非布爾值?
例如z = (x || y)
而不是z = (x ? x : y)
。
在JavaScript中,對於所有類型的變量(例如string,function,...),我總是可以使用布爾邏輯或代替條件運算符嗎?JavaScript:有條件(三元)vs布爾OR對於非布爾值?
例如z = (x || y)
而不是z = (x ? x : y)
。
他們是相似的,但不完全相同。如果選擇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 */
取決於您想要實現的目標。如果您正在處理字符串,例如(x || y)
轉換爲「如果字符串x不爲空/空或字符串y不爲空/空」,則返回1/true,而(x ? x : y)
轉換爲「ifstring x不爲null /空,則返回x,否則返回x (如果它是空的/ null)返回y「。 所以第一種方法將總是返回一個布爾值1/0或true/false,而第二種方法將返回2個變量的實際值之一。 話雖如此,如果您想在另一個if(z)
中使用結果(z),那麼它們是等效的。
ECMAScript language specification,第83頁:
生產LogicalORExpression:LogicalORExpression || LogicalANDExpression的計算方法如下:
- 設lref是評估LogicalORExpression的結果。
- 讓lval成爲GetValue(lref)。
- 如果ToBoolean(lval)爲true,則返回lval。
- 讓rref是評估LogicalANDExpression的結果。
- 返回GetValue(rref)。
所以||返回變量的值,而不是操作的布爾結果。該值由if (...)
語句轉換爲布爾值。
順便說一句,在同一頁面上,您可以找到(?:)運算符的描述並比較它們的工作方式。 – 2011-04-28 11:15:10
這兩個表達式在JavaScript等效的,因爲邏輯「或」運算符返回的第一個元素,如果是「真」或第二否則。
然而,你應該小心的值是true,什麼都考慮,而不是假的,因爲這是從其他動態類型語言的不同是什麼?例如兩者""
和0
是JavaScript和Python的假,但[]
是假的Python,但對Javascript真實。 在常見的Lisp中,所有的都被認爲是「真」(包括0
或""
或一個空數組),只有NIL被認爲是錯誤的例外(但是NIL也是「空列表」)。
非常有用的是undefined
被認爲是「虛假」的JavaScript中,因爲這允許例如寫這樣obj.redraw && obj.redraw();
代碼,將調用只有當它的存在,並且否則無爲redraw
方法(函數/方法是「真」爲Javascript)。
如果有x
或y
代替你不是說實際變量,但表情那麼這兩個是不等價的,因爲x
在「三元運算符」版本(在第一次評估,如果「真」)進行兩次評估,只一次在「邏輯」或「版本」中。如果x
是函數調用,這會有所不同。
如果你想強制一個值爲其布爾結果的Javascript最常見的成語可能是!!x
總是true
或false
。
不,這是錯誤的。 'x ||如果不是虛假的,則返回'x',否則返回'y'。 – 2011-04-28 11:10:37