Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除非vs if在Javascript中使用感叹号?_Javascript_Function_Oop_If Statement_Conditional Statements - Fatal编程技术网

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

除非vs if在Javascript中使用感叹号?,javascript,function,oop,if-statement,conditional-statements,Javascript,Function,Oop,If Statement,Conditional Statements,下面的代码试图打印出可被2整除的数字的“是偶数” 当测试的条件为“n%2”时,是否应该是if(test)then()而不是:if(!test)then()。下面的代码似乎是“如果数字不能被2整除,打印出‘数字是偶数’”,这似乎不符合逻辑 更一般地说,当我们只需编写If(!condition)时,编写一个除非函数比在指定条件中使用If语句有什么好处 非常感谢您的帮助 function unless(test, then) { if (!test) then(); } function repe

下面的代码试图打印出可被2整除的数字的“是偶数”

当测试的条件为“n%2”时,是否应该是if(test)then()而不是:if(!test)then()。下面的代码似乎是“如果数字不能被2整除,打印出‘数字是偶数’”,这似乎不符合逻辑

更一般地说,当我们只需编写If(!condition)时,编写一个除非函数比在指定条件中使用If语句有什么好处

非常感谢您的帮助

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
功能,除非(然后进行测试){
如果(!test)那么();
}
功能重复(次数,身体){
对于(var i=0;i
如果像本场景中那样以内联方式提供条件,则没有任何优势。您可以在所有情况下轻松地应用转换来否定它(例如,在前面添加一个
),并且从图片中删除
,除非
,否则意味着读者不必知道一件事

如果条件是以回调的形式提供的,则可能有好处,例如:

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

unless(test, function() { console.log("test failed"); });
在这种情况下,您不能直接将
test
的否定传递给一个假设函数
onlyIf
,该函数是
除非
的补充,因此同时使用
onlyIf
除非
可以使代码更具可读性,因为它允许您执行以下操作:

onlyIf(test, function() { console.log("test passed"); });
与此相反:

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

如果为回调提供了需要传播到
test

中的参数,则上述情况可能会更糟。这有争议的优点是,代码读起来更像英语:“除非n模2为非零,否则记录到控制台,n为偶数。”

根据我的经验,这样做的实际后果是大多数程序员将不得不再次检查what,除非()因为它不是一个标准的Javascript,他们无法知道它是否使用了!或==true或===0或其他任何稍微不同的测试,除非他们去查看实现


这一原则我最喜欢的例子是COBOL。这种语言非常努力地模仿英语,所以即使是非程序员也可以使用它……但实际上程序员和非程序员似乎都讨厌使用它。

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

if(test){}else{then}
即使在arrow函数到达之后,这也比执行uncler()要短。它还保留了对表达式进行“自由传递”的隐喻。我认为,出于语法原因,任何进一步尝试使用!或?:运算符都需要语言允许:

else(test){then}

有鉴于此,出于灵活性和现有性,我仍然会选择前者。

%
不测试可分性。它是一个运算符。此代码测试
n%2
的计算结果是否被认为是错误的(aka
0
),如果是,则为偶数。“下面的代码试图打印出来”是偶数“对于可被2整除的数字”-它不会尝试,它会尝试。(至少,一旦你修复了最后的语法错误,它就会这么做。)无论如何,我同意“除非"从语义上讲,这对测试没有什么意义,但代码确实具有所需的输出。这些类型的函数看起来像是属于测试框架的,如果断言被证明是错误的,您可以做出断言并执行某些操作。这段代码非常可怕,因为如果不小心,甚至不清楚它会执行什么操作分析。这里没有优势。我不能假设在一般情况下有优势。当你尖头的老板说这样做的时候,也许这样做是有利的,否则你会被解雇。你需要给出你什么时候可以让这个问题可行的上下文。@djechlin代码是其中的一部分。在这里,它似乎是上下文之外的,它只是一个e在解释高阶函数时,我基本上同意您在此上下文中编写的所有内容。但是,当以以下方式使用Perl时,它非常出色:
go_outside()和play()除非$is_;
。在这个特定的示例中,使用它不会受到任何惩罚,但与Perl中的所有内容一样,它很容易被滥用,从而降低代码的可读性。