我试图从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
我得到它说,用0,1,2运行以下代码3次测试:
if (!n%2) function(n) {
console.log(n, "is even");
});
我没有得到的是我们如何从
(!n%2)
中获得对/错?(!n%2)
与(!n%2 == 0)
相同吗? 最佳答案
您编写的测试代码与本文中的示例代码不同。
在示例代码中,首先评估n % 2
,然后将结果传递到unless
函数。在那里,您将对结果执行逻辑非运算。
如果n
是偶数,则n % 2
会将0
传递给unless
。 0
的布尔比较返回false
,而!
取反(逻辑非),所以!0 == true
。这反过来导致then
函数触发。
如果n
为奇数,则相反。传递了0
以外的其他值,该值的值为false
,导致then
不触发。
相反,您尝试不使用高阶函数来重现示例代码的方法将无法以相同的方式工作。 !n % 2
将首先对n
执行逻辑非,然后尝试对结果取模。 !(n % 2)
是示例代码的更好表示。