我试图从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传递给unless0的布尔比较返回false,而!取反(逻辑非),所以!0 == true。这反过来导致then函数触发。

如果n为奇数,则相反。传递了0以外的其他值,该值的值为false,导致then不触发。

相反,您尝试不使用高阶函数来重现示例代码的方法将无法以相同的方式工作。 !n % 2将首先对n执行逻辑非,然后尝试对结果取模。 !(n % 2)是示例代码的更好表示。

08-26 16:25