除非使用感叹号在Javascript中使用vs?

Hen*_*nry 11 javascript oop if-statement function conditional-statements

对于可被2整除的数字,下面的代码会尝试打印出"均匀".

如果不是(测试)那么()而不是:if(!test)then(),当条件测试是"n%2"时.下面的代码似乎是"IF数字不能被2整除,打印输出'数字是偶数'",这似乎不合逻辑.

更一般地说,在指定条件时使用If语句编写"除非"函数有什么好处,当我们可以做的只是写入if(!condition)?

任何帮助深表感谢.

function unless(test, then) {
  if (!test) then();
}
function repeat(times, body) {
  for (var i = 0; i < times; i++) body(i);
}

repeat(5, function(n) {
  unless(n % 2, function() {
    console.log(n, "is even");
});
// ? 0 is even
// ? 2 is even
// ? 4 is even
Run Code Online (Sandbox Code Playgroud)

Ixr*_*rec 6

这样做的可论证的优点是代码读起来更像英语:"除非n modulo 2非零,否则请记录n是偶数的控制台."

根据我的经验,这样做的实际结果是,大多数程序员必须仔细检查除非()实际做了什么,然后再对它感到满意.因为它不是一个标准的Javascript,他们无法知道它是否使用!或== true或=== 0或其他一些稍微不同的测试,除非他们去看看实现.

我最喜欢这个原理的例子是COBOL.这种语言非常难以像英语一样,所以即使是非程序员也可以使用它......但实际上程序员和非程序员似乎都讨厌使用它.

  • 大声笑@"*除非*他们去看看实现" (5认同)

Jon*_*Jon 2

如果像在这种情况下那样内联提供条件,则没有任何优势。您可以轻松地应用转换来在所有情况下适当地否定它(例如!在前面添加 ),并且unless从图片中删除意味着读者需要了解的事情少了一件。

如果以回调的形式提供条件可能会有优势,例如

function test() { return true; }
function unless(test, then) { if (!test()) then(); }

unless(test, function() { console.log("test failed"); });
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您无法直接将 的否定传递给与互补的test假设函数,因此同时拥有和可以使代码更具可读性,因为它允许您执行以下操作:onlyIfunlessonlyIfunless

onlyIf(test, function() { console.log("test passed"); });
Run Code Online (Sandbox Code Playgroud)

而不是这个:

onlyIf(function() { return !test(); }, function() { console.log("test passed"); });
Run Code Online (Sandbox Code Playgroud)

如果回调函数给出了需要传播到test.