我正在努力重写一些Javascript代码以在Excel VBA中工作。 由于在这个网站上搜索,我设法翻译了几乎所有的Javascript代码!但是,有一些代码我无法理解它正在做什么。 这是Javascript代码:
var k = x % y;
return (k != 0 && (k > 0 ^ y > 0) && isFinite(y)) ? k + y : k;
第一行对我来说很清楚。 k是x / y的余数。 在第二行中,modulo获得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。
答案 0 :(得分:1)
^
运算符是XOR或EXCLUSIVE OR,按位运算符。当且仅当一个值为true时,它才返回true。如果两者都为真,或两者都为假,则结果为假
a b a XOR b
0 0 0
0 1 1
1 0 1
1 1 0
至于为什么你的第二个例子返回FALSE,因为你正在使用AND逻辑:
FALSE && (FALSE ^ TRUE) && TRUE
会产生FALSE && TRUE && TRUE
,相当于FALSE
。
答案 1 :(得分:0)
按语言评估的关键部分的逐步说明:
(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
时
true
当且仅当k
是Number
或数字String
以上0
true
当且仅当y
是Number
或数字String
以上0
isFinite(y))
:true
如果y
不是undefined, Object, Array, Infinity, -Infinity, ...
(其他原生对象)或非数字String
(k != 0 && (k > 0 ^ y > 0) && isFinite(y))
:true
当且仅当上述两个部分均为true
时。如果前置表达式为?
,则三元k + y
运算符将返回第一个后表达式true
,否则返回第二个后置表达式k
。
更一般地说,外卖课程是:
JS中的比较很复杂:String
通常转换为Number
,不同的函数在本机对象上有不同的行为(isFinite(null) === true
但isFinite(undefined) === false
)。因此,通常总是更喜欢使用===
和!==
。
JS在布尔运算符
^
是独家OR
又名XOR
运算符
?
是三元if
运算符,等于if ... do ... else do ...