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

时间:2015-01-23 23:43:57

标签: javascript function oop if-statement conditional-statements

下面的代码尝试打印出“可以”除以2的数字。

如果不是if(test)那么()而不是: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

3 个答案:

答案 0 :(得分:6)

这样做的可论证的优点是代码读起来更像英语:&#34;除非n modulo 2非零,否则登录控制台n是偶数。&#34;

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

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

答案 1 :(得分:1)

如果在这种情况下内联提供条件,则没有任何优势。您可以轻松地应用转换以在所有情况下适当地否定它(例如,在前面添加!),并且从图片中取出unless意味着读者必须知道的事情少一些。

如果条件是以回调的形式提供的话,那么可能有利,例如:

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

unless(test, function() { console.log("test failed"); });

在这种情况下,您无法直接将test的否定传递给与onlyIf互补的假设函数unless,因此同时拥有onlyIf和{{1}可以使代码更具可读性,因为它允许你这样做:

unless

而不是:

onlyIf(test, function() { console.log("test passed"); });

如果回调被赋予需要传播到onlyIf(function() { return !test(); }, function() { console.log("test passed"); }); 的参数,上述情况可能会更糟。

答案 2 :(得分:0)

我同意 Mahdi 的观点,这很可能是对一个故意奇怪的回调示例的反应,但为了完整起见 - 加上对否定的特别兴趣 - 还有一个选择:

if(test){}else{then}

即使在箭头函数到来之后,这也比执行unless()要短。它还保留了对表达式进行“免费通行”的比喻。我认为任何进一步的尝试与 !或 ?: 出于语法原因的运算符,实际上,需要语言允许:

else(test){then}

考虑到这一点,我仍然会选择前者以获得灵活性和现有性。 :)