非典型用于Javascript的++和 - 运算符

时间:2011-11-09 00:07:28

标签: javascript operators increment decrement pre-increment

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

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

认为这是Why avoid increment ("++") and decrement ("--") operators in JavaScript?的副本,而是它的必然结果:何时避免它们,而是将它们用于您的优势。当然我可能会弄错,可能有一些原因我不会想到为什么以下是充满危险的,尽管我觉得自己很优雅 - 如果我错过了关于以下内容的次优,我我也想知道

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

4 个答案:

答案 0 :(得分:5)

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

在过去的几十年里,我已经对代码产生了强烈的厌恶,即使显而易见的方法需要更多的代码,也不会立即明显。如果混合中不止一个人,隐含和魔法代码几乎总是难以维护。

具体评论:我不明白为什么你认为你的代码比以下更简洁,优雅或可读:

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

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

最后,如下所述,你会阻碍Javascript最小化,并且从最终的简洁角度来看,用户唯一关心的是页面加载的速度......

答案 1 :(得分: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,所以缩小器更难以缩小

。 一个好的minifier会把后者变成类似

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

但通过不必要的任务完成工作的人数会减少。他们在closure compiler

下进行了比较
var a=str.indexOf(substr);++a&&doSomething(--a)

VS

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

因为闭包编译器错过了将a>=0&&转换为a<0||的机会,但增量和减量仍然更长。

答案 2 :(得分:2)

嗯,这肯定是“非典型的”。它也是“聪明的”。在“ boy中,我希望我永远不必支持像聪明那样的”代码。

代码应该是可读的。我们花费多花时间阅读代码而不是写代码。事实并非如此。

答案 3 :(得分: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++;
 }