在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