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 为真。如果两者都为真,或者都为假,则结果为假
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
k != 0
: true
如果 k
不在 0, '0', 0.0, '0.0'
(k > 0 ^ y > 0)
: true
当且仅当 1. 和 2. 之一是 true
- k > 0:
true
当且仅当 k
是 0
之上的 Number
或数字 String
- y > 0:
true
当且仅当 y
是 0
之上的 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) === true
但 isFinite(undefined) === false
).因此通常总是喜欢使用 ===
和 !==
.
JS 在布尔运算符上使用 short-circuiting
^
是唯一的 OR
又名 XOR
运算符
?
是三元 if
运算符,等于 if ... do ... else do ...
我正在重写一些 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 为真。如果两者都为真,或者都为假,则结果为假
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
k != 0
:true
如果k
不在0, '0', 0.0, '0.0'
(k > 0 ^ y > 0)
:true
当且仅当 1. 和 2. 之一是true
- k > 0:
true
当且仅当k
是0
之上的 - y > 0:
true
当且仅当y
是0
之上的
Number
或数字String
Number
或数字String
- k > 0:
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) === true
但isFinite(undefined) === false
).因此通常总是喜欢使用===
和!==
.JS 在布尔运算符上使用 short-circuiting
^
是唯一的OR
又名XOR
运算符?
是三元if
运算符,等于if ... do ... else do ...