用||声明变量

时间:2012-09-10 12:40:51

标签: javascript variables

  

可能重复:
  In Javascript, what does it mean when there is a logical operator in a variable declaration?

只是一个简单的问题。当我声明一个这样的变量时:

    var ballctx = ctx['ballctx'] || createCanvas('game-screen', 'ballctx');

是先尝试左边第一个还是右边第一个?如果ballctx的ctx不存在,我希望它创建一个新画布。如果确实如此,则使用它。

6 个答案:

答案 0 :(得分:5)

左边第一个。 ||使用所谓的short-circuit evaluation,也称为最小评估,这意味着它只会评估表达式的右侧,如果左侧side是 false

来自ECMAScript语言规范:

  

11.11. Binary Logical Operators

     

生产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.   

因此,在你的表达中:

ctx['ballctx'] || createCanvas('game-screen', 'ballctx');
^-- lval          ^-- rval

如果lval 评估true,则不会评估rval。换句话说,如果ctx['ballctx']的计算结果为false,则只会创建一个新的画布,因此您的代码是正确的。

答案 1 :(得分:2)

先离开。 如果隐式转换为布尔值失败则为正确。

答案 2 :(得分:1)

它尝试左边的一个,如果它是真的,它将不会执行右边的函数。

答案 3 :(得分:1)

如果ctx['ballctx']truthy,那么

  • createCanvas('game-screen', 'ballctx')未获得评估
  • ctx['ballctx']已分配到ballctx

,否则

    评估
  • createCanvas('game-screen', 'ballctx')
  • 无论createCanvas次回复分配给ballctx

答案 4 :(得分:1)

如果大约等于true,则采用左表达式的值,否则无论值如何都采用右表达式的值。在一些较旧的浏览器中,根据过时的JavaScript 1.1规范,只返回true或false。

请参阅MDN:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Logical_Operators#Summary

答案 5 :(得分:0)

先离开。如果left为false或未定义,则只执行函数。