4

如果我从 Crockford 的“Javascript: The Good Parts”中正确回忆,他不赞成使用 ++ 或 -- 运算符,但我也倾向于记得他没有提供特别强烈的反对它们的论据。

下面是这些运算符的使用,我发现它们有助于使我的代码尽可能简洁,特别是在处理返回 -1 的函数/方法时,0 是第一个可能的有效返回值(以及正整数)。我会对 ++ 和/或的其他非典型用法感兴趣——它们强烈支持在有意义时使用这些运算符。

不认为这是为什么避免 JavaScript 中的自增(“++”)和自减(“--”)运算符的重复?而是推论:何时避免它们,而是利用它们为您带来优势。当然,我可能会弄错,并且可能有某种原因我没有想到为什么以下内容充满危险,尽管在我看来很优雅——如果我遗漏了以下内容的次优之处,我我也想知道

var substrIdx = str.indexOf(substr);
if (++substrIdx) {
  doSomething(--substrIdx);
}
4

4 回答 4

5

简洁与可读性或可维护性不同,优雅在维护者眼中。您发布的代码对我来说似乎不必要地不透明。

在过去的几十年里,我对不明显的代码产生了强烈的反感,即使明显的方法需要更多的代码。如果多人参与其中,隐式代码和魔术代码几乎总是难以维护。

具体评论:我不明白为什么您认为您的代码比以下内容更简洁、优雅或可读性:

var substrIdx = str.indexOf(substr);
if (substrIdx >= 0) {
  doSomething(substrIdx);
}

它的效率也有点低,因为您正在执行两个操作和一个比较,而不仅仅是一个比较。此外,您将整数误认为是布尔值,从维护的角度来看,这几乎总是一个坏主意。

最后,如下所述,您正在阻碍 Javascript 最小化程序,从最后简洁的角度来看,用户唯一关心的是页面加载的速度......

于 2011-11-09T00:18:04.347 回答
4

如果我错过了以下内容的次优,我也想知道

var substrIdx = str.indexOf(substr);
if (++substrIdx) {
  doSomething(--substrIdx);
}

这是次优的。它使人类感到困惑,需要在浏览器上传送更多代码,并且需要解释器在运行时做更多的工作。

试图弄清楚它是什么的人,必须对substrIdx代码中不同点的状态进行推理——“它遵守indexOf这里的合同,但那里的合同比 的合同大一个indexOf,之后if它没有明确的关系substr。”。

它也比

var substrIdx = str.indexOf(substr);
if (substrIdx>=0) {
  doSomething(substrIdx);
}

缩小器更难缩小,因为substrIdx不再是单个作业var。一个好的缩小器会将后者变成类似的东西

var substrIdx = str.indexOf(substr);
substrIdx<0||doSomething(substrIdx);

但很少有人会承担不必要的任务。它们在闭包编译器下比较好:

var a=str.indexOf(substr);++a&&doSomething(--a)

对比

var a=str.indexOf(substr);a>=0&&doSomething(a)

因为闭包编译器错过了转a>=0&&成的机会,a<0||但自增自减还是比较长。

于 2011-11-09T00:20:36.873 回答
2

嗯,这肯定是“非典型的”。它也很“聪明”。在“男孩,我希望我永远不必支持这样写的代码”“聪明”的脉络。

代码应该是可读的。我们花在阅读代码上的时间比编写代码要多得多这不是。

于 2011-11-09T00:25:11.613 回答
0

我认为可以接受的唯一情况是当增量的结果没有被存储时,因此它是前增量还是后增量都没有关系,并且不会成为错误的来源。

 var j=0;
 // These three examples are OK in my mind
 for (var i=0; i < 20; i++) {
    doSomething()
 }

 while ( i < 100) {
   if (someTest()) {
      j++;
   }      
   i++;
 }
于 2011-11-09T00:35:26.047 回答