只是一个快速的问题。当我声明这样的变量时:
var ballctx = ctx['ballctx'] || createCanvas('game-screen', 'ballctx');
它是先尝试左侧还是先尝试右侧?ballctx
如果 ctx of不存在,我希望它创建一个新画布。如果是这样,它会使用它来代替。
只是一个快速的问题。当我声明这样的变量时:
var ballctx = ctx['ballctx'] || createCanvas('game-screen', 'ballctx');
它是先尝试左侧还是先尝试右侧?ballctx
如果 ctx of不存在,我希望它创建一个新画布。如果是这样,它会使用它来代替。
左边第一。||
使用所谓的短路评估,也称为最小评估,这意味着它只会评估表达式的右侧,如果左侧为false。
来自 ECMAScript 语言规范:
产生式 LogicalORExpression :
LogicalORExpression || LogicalANDExpression
评估如下:
- 令 lref 为评估 LogicalORExpression 的结果。
- 令 lval 为 GetValue(lref)。
- 如果 ToBoolean(lval) 为真,则返回 lval。
- 令 rref 为评估 LogicalANDExpression 的结果。
- 返回 GetValue(rref)。
因此,在你的表达中:
ctx['ballctx'] || createCanvas('game-screen', 'ballctx');
^-- lval ^-- rval
如果lval
评估为true
,rval
则不会被评估。换句话说,如果ctx['ballctx']
评估结果为 false,您只会创建一个新画布,因此您的代码是正确的。
先离开了。如果隐式转换为布尔值失败,那么正确。
它尝试左边的,如果它是真的,它不会执行右边的功能。
如果ctx['ballctx']
是真的那么
createCanvas('game-screen', 'ballctx')
没有得到评估ctx['ballctx']
被分配到ballctx
除此以外
createCanvas('game-screen', 'ballctx')
被评估createCanvas
回报被分配给ballctx
如果近似等于真,则取左侧表达式的值,否则取右侧表达式的值而不管值。在一些较旧的浏览器中,根据已经过时的 JavaScript 1.1 规范,只返回 true 或 false。
参见 MDN:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Logical_Operators#Summary
先离开了。如果 left 为 false 或未定义,则只执行函数。