Javascript 为什么要减少代码,只调用一次函数?

Javascript 为什么要减少代码,只调用一次函数?,javascript,node.js,algorithm,ecmascript-6,Javascript,Node.js,Algorithm,Ecmascript 6,有人能解释为什么这两段代码不一样吗 第一个是正确的, if (coolDownTimer.read() === 0) { alert() if (errorCoolDownPeriod > 0) { await coolDownTimer.start() } } else if (coolDownTimer.read() >= errorCoolDownPeriod) { alert() coolDownTimer.reset() } 但是我不喜欢将al

有人能解释为什么这两段代码不一样吗

第一个是正确的,

if (coolDownTimer.read() === 0) {
  alert()
  if (errorCoolDownPeriod > 0) {
    await coolDownTimer.start()
  }
} else if (coolDownTimer.read() >= errorCoolDownPeriod) {
  alert()
  coolDownTimer.reset()
}
但是我不喜欢将
alert()
写入两次,所以既然
errorcooldownpiriod
是一个正数,我想我可以这样做

if (coolDownTimer.read() > 0) {
  alert()
    if (coolDownTimer.read() === 0) {
//      alert()
      if (errorCoolDownPeriod > 0) {
        await coolDownTimer.start()
      }
    } else if (coolDownTimer.read() >= errorCoolDownPeriod) {
//      alert()
      coolDownTimer.reset()
    }
}
但当我测试它时,它们的行为却不一样

问题:
为什么这两个代码段的行为不一样?

当满足条件
coolDownTimer.read()==0
时,第二个代码段是nop。我猜您会混淆已排序的
if
s和
if
/
然后
/
else
s。

当满足条件
coolDownTimer.read()==0
时,第二个代码段是nop。我猜你混淆了排序的
if
s和
if
/
然后
/
else
s。

在第一段代码中,
alert()
coolDownTimer.read()==0
coolDownTimer.read()>=errorcooldowntperiod
时执行

正确的重构是:

const timer=coolDownTimer.read();
如果(计时器==0 | |计时器>=错误冷却期){
警惕();
如果(计时器===0&&errorCoolDownPeriod>0){
等待冷却计时器。开始()
}否则如果(计时器!==0){
coolDownTimer.reset()
}
}

更可能的是,您对值有特定的限制,例如,我假设所有值都是实时计时器,因此只包含正值。

在第一个代码段中,
alert()
coolDownTimer.read()==0
coolDownTimer.read()>=errorcooldowntperiod
时执行

正确的重构是:

const timer=coolDownTimer.read();
如果(计时器==0 | |计时器>=错误冷却期){
警惕();
如果(计时器===0&&errorCoolDownPeriod>0){
等待冷却计时器。开始()
}否则如果(计时器!==0){
coolDownTimer.reset()
}
}

更可能的是,您对值有特定的限制,例如,我假设所有值都是实时计时器,因此只包含正值。

@Thomas对OP的评论解释了这个问题。您不能让
n===0&&n>0
,因此要只调用一次
alert()
,您应该这样做

if (coolDownTimer.read() === 0 || coolDownTimer.read() >= errorCoolDownPeriod) {
  alert()
    if (coolDownTimer.read() === 0) {
//      alert()
      if (errorCoolDownPeriod > 0) {
        await coolDownTimer.start()
      }
    } else if (coolDownTimer.read() >= errorCoolDownPeriod) {
//      alert()
      coolDownTimer.reset()
    }
}

例如,在新的外部if语句中使用每个条件和/或它们。

@Thomas对OP的评论解释了这个问题。您不能让
n===0&&n>0
,因此要只调用一次
alert()
,您应该这样做

if (coolDownTimer.read() === 0 || coolDownTimer.read() >= errorCoolDownPeriod) {
  alert()
    if (coolDownTimer.read() === 0) {
//      alert()
      if (errorCoolDownPeriod > 0) {
        await coolDownTimer.start()
      }
    } else if (coolDownTimer.read() >= errorCoolDownPeriod) {
//      alert()
      coolDownTimer.reset()
    }
}

例如,在新的外部if语句中取每个条件和/或它们。

好的
coolDownTimer.read()>0
coolDownTimer.read()==0
看起来它们是不兼容的条件。是的,出于某种原因,但我不明白为什么。
if(coolDownTimer.read()>0)。。。if(coolDownTimer.read()==0)
永远不会进入第二个条件,因为如果它进入第一个条件,
coolDownTimer.read()
的值永远不会满足第二个条件。你是认真的吗?一个数字可以同时是零和非零吗?@sandraschlich因为一个值不能同时是
n===0&&n>0
那么
coolDownTimer.read()>0
coolDownTimer.read()==0
看起来它们是不兼容的条件。是的,出于某种原因,但我不明白为什么。
if(coolDownTimer.read()>0) ... if(coolDownTimer.read()==0)
永远不会进入第二个条件,因为如果它进入第一个条件,
coolDownTimer.read()
的值永远不会满足第二个条件。你是认真的吗?一个数字可以同时为零和非零吗?@SandraSchlichting,因为一个值不能同时为
n===0&&n>0
,因为她没有加入到问题下已经进行的讨论中,也因为她没有说一种语言,OP可以理解,因为她缺乏布尔逻辑。这个问题甚至不应该被回答。由于没有加入到问题下已经进行的讨论中,也因为没有说OP可以理解的语言而被否决,因为她缺乏布尔逻辑。这个问题甚至不应该被回答。你的意思是因为这个
const timer=coolDownTimer.read()
?你的意思是因为这个
const timer=coolDownTimer.read()
?@Sandra,我认为重复这些条件实际上比重复
alert()
更不干净。如果
alert()
实际上是一个较大的代码段,那么将其提取到一个helper函数中,这样您就可以真正调用它两次,这可能是有意义的。@Sandra和我认为重复
alert()
的条件实际上没有那么干净。如果
alert()
实际上是一个较大的代码段,那么将其提取到一个helper函数中,这样您就可以真正地调用它两次。