1

可能重复:
在 Javascript 中,变量声明中有逻辑运算符是什么意思?

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

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

它是先尝试左侧还是先尝试右侧ballctx如果 ctx of不存在,我希望它创建一个新画布。如果是这样,它会使用它来代替。

4

6 回答 6

5

左边第一。||使用所谓的短路评估,也称为最小评估,这意味着它只会评估表达式的右侧,如果左侧为false

来自 ECMAScript 语言规范:

11.11。二元逻辑运算符

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

  1. 令 lref 为评估 LogicalORExpression 的结果。
  2. 令 lval 为 GetValue(lref)。
  3. 如果 ToBoolean(lval) 为真,则返回 lval。
  4. 令 rref 为评估 LogicalANDExpression 的结果。
  5. 返回 GetValue(rref)。

因此,在你的表达中:

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

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

于 2012-09-10T12:43:07.217 回答
2

先离开了。如果隐式转换为布尔值失败,那么正确。

于 2012-09-10T12:43:03.550 回答
1

它尝试左边的,如果它是真的,它不会执行右边的功能。

于 2012-09-10T12:43:19.220 回答
1

如果ctx['ballctx']真的那么

  • createCanvas('game-screen', 'ballctx')没有得到评估
  • ctx['ballctx']被分配到ballctx

除此以外

  • createCanvas('game-screen', 'ballctx')被评估
  • 任何createCanvas回报被分配给ballctx
于 2012-09-10T12:43:39.643 回答
1

如果近似等于真,则取左侧表达式的值,否则取右侧表达式的值而不管值。在一些较旧的浏览器中,根据已经过时的 JavaScript 1.1 规范,只返回 true 或 false。

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

于 2012-09-10T12:50:58.687 回答
0

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

于 2012-09-10T12:46:09.927 回答