我正在尝试从Eloquent JavaScript了解此代码:
function unless(test, then) {
if (!test) then();
}
function repeat(times, body) {
for (var i = 0; i < times; i++) body(i);
}
repeat(3, function(n) {
unless(n % 2, function() {
console.log(n, "is even");
});
});
// → 0 is even
// → 2 is even
我得到它说,运行以下代码3次测试0,1,2:
if (!n%2) function(n) {
console.log(n, "is even");
});
我不知道如何从(!n%2)
获得真/假?
(!n%2)
与(!n%2 == 0)
相同吗?
答案 0 :(得分:1)
Logical NOT !
有higher precedence而不是modulo operator %
。
因此,(!n%2)
相当于(!n) % 2
,除了n = 0
之外,它总是返回0一个假值。
(!n%2 == 0)
将返回true
(再次除了0 )。
它们两者并不相等,实际上它们彼此相反(虚假与真实价值)。
您需要!(n % 2)
。
或者只是检查数字是否均为
n % 2 === 0
答案 1 :(得分:0)
!Boolean(n%2)
应该用来确定一个是偶数还是奇数。
请记住,布尔值不遵循BIDMAS。
!n
首先将n
视为布尔值,以便将0
的数值视为false
,并将任何其他数值视为{ {1}}。感叹号反转true
的逻辑状态。
现在n
将布尔值转换回%2
为true
且1
为0
的整数。 false
返回!n = 0
,0
返回!n = 1
。
在if语句中使用1
会将其转换回布尔值(!n%2
,1 = true
)。
因此,如果0 = false
,则if语句继续执行,因为它返回true。如果n = 0
(n != 0
表示不相等)则跳过if语句,因为它返回false。
答案 2 :(得分:0)
不,不是。如上所述here&#34;!&#34;运算符的优先级高于&#34;%&#34;因此,如果n为0,则表达式将返回true;如果n与0不同,则表达式将返回false。
更详细地说,假设n是2.表达式的执行是:
(!n)%2
(!2)%2
0%2
0
所以它是假的,现在是n = 0
(!0)%2
1%2
1
所以这是真的。如果n与0不同,则(!n%2 == 0)的相反行为返回true,否则返回false,因为==具有较少的优先级,并且在上面的计算结束时执行与0的比较。您可以通过使用具有不同n值的简单javascript来轻松说服自己:
n = 1;
if(!n%2)
{
document.getElementById("par1").innerHTML="true";
}
if(!n%2 == 0)
{
document.getElementById("par2").innerHTML="true";
}
答案 3 :(得分:0)
您编写的测试代码与本文中的示例代码不同。
在示例代码中,首先评估n % 2
,并将结果传递给unless
函数。在那里,您正在对结果执行Logical Not操作。
如果n
为偶数,则n % 2
会将0
传递给unless
。 0
的布尔比较返回false
,!
否定结果(逻辑非),因此!0 == true
。反过来,这会导致then
函数触发。
如果n
为奇数,则会发生相反的情况。传递了0
以外的某些值,其值为false
,导致then
无法触发。
相反,您尝试在不使用高阶函数的情况下重现示例代码不会以相同的方式工作。 !n % 2
将首先在n
上执行Logical Not,然后尝试对结果进行模数化。 !(n % 2)
是示例代码的更好表示。