javascript(布尔值 ^ 布尔值)

javascript (boolean ^ boolean)

我正在重写一些 Javascript 代码以在 Excel VBA 中工作。 由于在这个网站上搜索,我已经设法翻译了几乎所有 Javascript 代码!但是,有些代码我无法准确理解它在做什么。 这是 Javascript 代码的一部分:

var k = x % y;
return (k != 0 && (k > 0 ^ y > 0) && isFinite(y)) ? k + y : k;

第一行我很清楚。 k是x/y的余数。 在第二行中,取模得到 k+y 或 k 的值。这是由 (k!=0 && (k > 0 ^ y > 0) && isFinite(y))

决定的

有人可以逐步向我解释我应该如何阅读这段代码吗?特别是 &&(k>0^y>0)&& 让我很困惑。

这是我到目前为止的进展:

示例 1:x=9 和 y=4

k = 9%4 = 9/4=2 with remainder 1    So: k=1
(1!=0&&(1>0^4>0)&&isFinite(4))   (True AND (True^True) AND True)  =  True?

示例 1:x=9 和 y=1

k = 9%1 = 9/1=9 with remainder 0    So: k=0
(0!=0&&(0>0^1>0)&&isFinite(1))  (False AND (False^True) AND True)  =  False?

如果我纯粹从数学角度思考,那么我猜 (False^True) 部分应该读作 (0^1) = 0 = False。

^ 运算符是异或或异或按位运算符。当且仅当一个值为真时,它才 returns 为真。如果两者都为真,或者都为假,则结果为假

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR

a b a XOR b 0 0 0 0 1 1 1 0 1 1 1 0

至于为什么你的第二个例子 returns FALSE,那是因为你使用了 AND 逻辑:

FALSE && (FALSE ^ TRUE) && TRUE 结果 FALSE && TRUE && TRUE 等同于 FALSE.

按语言评估的关键部分的逐步解释:

(k != 0 && (k > 0 ^ y > 0) && isFinite(y)) ? k + y : k;

  • (k != 0 && (k > 0 ^ y > 0): true 当且仅当下面的 1. 和 2. 是 true
    1. k != 0: true 如果 k 不在 0, '0', 0.0, '0.0'
    2. (k > 0 ^ y > 0): true 当且仅当 1. 和 2. 之一是 true
      1. k > 0: true 当且仅当 k0
      2. 之上的 Number 或数字 String
      3. y > 0: true 当且仅当 y0
      4. 之上的 Number 或数字 String
  • isFinite(y)): true 如果 y 不是 undefined, Object, Array, Infinity, -Infinity, ... (进一步的本地对象)之一或非数字 String

  • (k != 0 && (k > 0 ^ y > 0) && isFinite(y)): true 当且仅当以上两部分都是 true。三元 ? 运算符将 return 第一个 post-表达式 k + y 如果前置表达式是 true 和第二个 post-表达式 k 否则.

更笼统地说,外带课程是:

  • JS 中的比较很复杂:String 经常转换为 Number 并且不同的函数在原生对象上有不同的行为(isFinite(null) === trueisFinite(undefined) === false).因此通常总是喜欢使用 ===!==.

  • JS 在布尔运算符上使用 short-circuiting

  • ^ 是唯一的 OR 又名 XOR 运算符

  • ? 是三元 if 运算符,等于 if ... do ... else do ...