JavaScript中此行的意义和目的——star[t][0] > x << 1 && (star[t][0] -= w << 1, test = !1)。

4
我在以下网址中的标题看到了一个画布动画 - http://blogs.msdn.com/b/davrous/archive/2011/07/21/html5-gaming-animating-sprites-in-canvas-with-easeljs.aspx 这里有一个 jsfiddle: here 在查看 JavaScript 代码时,有几行令人烦恼的代码花费了很多时间来理解它们,但仍然没有运气,只能求助于 StackOverflow 上的专家。
这些行是(jsfiddle中的第85-90行) -
 star[t][0] += mouse_x >> 4, 
 star[t][0] > x << 1 && (star[t][0] -= w << 1, test = !1), 
 star[t][0] < -x << 1 && (star[t][0] += w << 1, test = !1), 

这一切都在一个for循环中运行。对我来说最困惑的是,在第1行赋值后,在第2行和第3行进行这两个比较。当这两个比较的结果没有被存储到任何变量中时,这样做的目的是什么?


这些是位运算符,而不是比较运算符。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators - shannonman
是的,我知道位运算符,但是我指的是比较运算符 &&。另外,上面的 '>' 和 '<' 运算符让我很难理解整个代码。无论如何,感谢您关注这个问题。非常感激。 - Anmol Saraf
是的,你说得对 @csharpler - Anmol Saraf
1个回答

5

"当第2行和第3行的比较结果都没有存储到任何变量中时,这句话的目的是什么?"

它使用 && 作为 if 的简写,因为 && 运算符首先计算左侧操作数,只有在其为真值(truthy)时才会计算右侧操作数。

该行代码:

star[t][0] > x << 1 && (star[t][0] -= w << 1, test = !1)

可以被改写为:

if (star[t][0] > x << 1) {
   star[t][0] -= w << 1, test = !1;
}

(第三行也是类似的方式。)
另外,!1false 的简写形式。

好的,true 布尔值并非总是 1,但在大多数情况下它是 1,有时候也可能是其他数字。 - Muhammad Talha Akbar
@AspiringAqib !1总是false,因为!运算符对非布尔值的处理方式。这并不意味着1等于true - nnnnnn
所以我猜测从这一行返回的结果 - (star[t][0] -= w << 1, test = !1) 总是为 false,因为逗号运算符将执行两个操作数,但将返回最后一个操作数,这里是 test = !1,并且通过 && 比较整体结果将为 false,或者这整行代码只是用于执行 ---> star[t][0] -= w << 1 <--- 如果 && 前面的第一个操作数为 true?如果我没有正确解释,请告诉我。 - Anmol Saraf
由于表达式没有被分配到任何地方或返回,因此返回值是无关紧要的。该表达式仅仅是为了设置 star[t][0]test 的副作用而被执行。 - Barmar
太好了,现在所有的疑惑都解决了。感谢大家,特别是@nnnnnn的帮助。这就是StackOverflow的优越之处,因为我们可以在这里得到专家的帮助。再次感谢 :) - Anmol Saraf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接