JavaScript:条件(三元)vs布尔值对于非布尔值?

时间:2011-04-28 11:04:12

标签: javascript

在JavaScript中,我是否可以对所有类型的变量(例如字符串,函数......)使用布尔OR而不是条件运算符?

例如z = (x || y)代替z = (x ? x : y)

4 个答案:

答案 0 :(得分:7)

它们相似,但不完全相同。如果选择x ? x : yx最终会评估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 */

答案 1 :(得分:2)

ECMAScript language specification,第83页:

  

生产LogicalORExpression:LogicalORExpression || LogicalANDExpression的评估如下:

     
      
  1. 让lref成为评估LogicalORExpression的结果。
  2.   
  3. 让lval成为GetValue(lref)。
  4.   
  5. 如果ToBoolean(lval)为true,则返回lval。
  6.   
  7. 让rref成为评估LogicalANDExpression的结果。
  8.   
  9. 返回GetValue(rref)。
  10.   

所以||返回变量的值,而不是操作的布尔结果。该值由if (...)语句转换为布尔值。

答案 2 :(得分:1)

这两个表达式在javascript中是等价的,因为逻辑“or”运算符返回第一个元素,如果它是“true”,否则返回第二个元素。

但是你应该注意哪些值是真的,哪些值被认为是假的,因为这与其他动态类型的语言不同...例如,对于Javascript和""0都是假的Python,但[]对于Python来说是假的,但对于Javascript来说却是如此。 在Common Lisp中,所有内容都被认为是“真实的”(包括0""或空数组),唯一的例外是NIL被认为是假的(NIL也是“空列表”)。

非常有用的是,undefined被Javascript视为“假”,因为这样可以编写obj.redraw && obj.redraw();之类的代码,只有在redraw方法存在并执行时才会调用x方法否则没有(对于Javascript,函数/方法是“真实的”)。

如果使用yx而不是实际变量而是表达式,则两者不等效,因为“三元运算符”版本中的x将被评估两次(如果在第一次评估时为“true”,在“逻辑或”版本中只有一次。如果!!x是函数调用,这会有所不同。

如果你想强制一个值为Javascript的布尔结果,最常见的习语可能是true,总是false或{{1}}。

答案 3 :(得分:-3)

取决于您要实现的目标。如果您正在处理字符串,例如(x || y)转换为“如果字符串x不为空/空或字符串y不为空/空”则返回1 / true,而(x ? x : y)转换为“ifstring x is not null / empty然后返回x否则(如果它为空/ null)返回y“。 所以第一种方法总是返回一个布尔值1/0或者是真/假,而第二种方法将返回一个2个变量的实际值。 话虽如此,如果你想在另一个if(z)中使用结果(z),那么它们是等价的。