2011-04-28 57 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