jslint中的"意外的++"错误

Kdg*_*Dev 146 javascript jslint

什么对于那么最好的做法是什么?

Jslint解释说它"增加了混乱".我真的不明白......

编辑:代码,按要求:

  var all,l,elements,e;
  all = inElement.getElementsByTagName('*');
  l = all.length;
  elements = [];
  for (e = 0; e < l; (e++))
  {
    if (findIn)
    {
        if (all[e].className.indexOf(className) > 0)
        {
            elements[elements.length] = all[e];
        }
    } else {
        if (all[e].className === className)
        {
            elements[elements.length] = all[e];
        }
    }
  }
Run Code Online (Sandbox Code Playgroud)

uno*_*omi 93

使用i += 1相反,如果你想跟随的JSLint的建议.

  • @MattClarkson:根据Crockford的说法:*增量`++`和减少`--`运算符使得以极其简洁的风格编写成为可能.在诸如C语言之类的语言中,它们可以编写单行代码:`for(p = src,q = dest;!*p; p ++,q ++)*q =*p;`大多数缓冲区溢出错误创建了可怕的安全漏洞是由于这样的代码.在我自己的实践中,我观察到当我使用`++`和`--`时,我的代码往往太紧,太棘手,太神秘.因此,作为纪律问题,我不再使用它们了.* (29认同)
  • 这并没有真正解释"增加"的混乱.@ samir-talwar补充说明. (10认同)
  • @MattClarkson:在'for`中它的使用是清楚的,并且没有发生混淆,但在其他情况下使用可能是神秘和混乱.我假设要防止在其他更复杂的代码段中编写隐秘代码,最好一起避免.这只是一个建议,可以忽略:) (5认同)
  • 只是忽略它; JSLint有时对事物有非常奇怪的解释......有时很方便,但有时很烦人. (5认同)
  • @FrançoisWahl感谢*Crockford*解释 (4认同)

Ric*_*tag 88

只需/*jslint plusplus: true */在您的javascript文件前添加.

  • 虽然截至2014年7月9日,Crockford警告[他正在删除该选项](https://plus.google.com/+DouglasCrockfordEsq/posts/aBLU9y4Fd4z)以及其他几个.`在下一版的JSLint中,我将删除几个选项... ass,closure,continue,eqeq,newcap,nomen,plusplus,sloppy,stupid,sub. (7认同)
  • .jshintrc中的````plusplus":false``` (5认同)
  • 太好了 - 非常感谢您提供这些信息! (2认同)

Sea*_*sey 28

为避免混淆,以及使用minifier时可能出现的问题,当与操作符及其操作数一起使用时,始终将parens包裹在同一个(+或 - )中.

var i = 0, j = 0;
alert(i++ +j);
Run Code Online (Sandbox Code Playgroud)

这会增加i和j(并将i作为副作用递增),从而导致0被警告.

但是有人出现并移动空间?

var i = 0, j = 0;
alert(i+ ++j);
Run Code Online (Sandbox Code Playgroud)

现在,这首先增加j,然后将i添加到j的新值,从而导致1被警告.

通过这样做可以轻松解决这个问题

var i = 0, j = 0;
alert((i++) +j); 
Run Code Online (Sandbox Code Playgroud)

现在这不容错误.

  • jslint似乎对此有任何迂腐.使用`i ++`清楚地写了几百万个for循环?不知何故,尽管围绕着括号并保护增量声明,我们都幸存了下来. (14认同)
  • 好的,那么你只需要在你的jslint选项中设置`plusplus:false`.这应该禁用该检查. (7认同)
  • 谢谢你的解释.我尝试使用in(e ++)而不是e ++,但JSLint仍然存在. (2认同)

Sam*_*war 13

就个人而言,我更愿意单独陈述诸如此类的陈述i++.将它们作为较大声明的一部分包括在内可能会使那些不确定该行应该做什么的人感到困惑.

例如,而不是:

value = func(i++ * 3);
Run Code Online (Sandbox Code Playgroud)

我会这样做:

value = func(i * 3);
i++;
Run Code Online (Sandbox Code Playgroud)

这也意味着人们不必记住如何i++++i工作,而且无需申请这么多偏好规则.


ben*_*ico 9

++操作员的真正问题在于它是一个具有副作用的操作员,因此它完全违背了函数式编程的原理.

实现的" 功能 "方式i++i = i + 1明确重新分配变量而没有副作用然后使用它.

混淆的可能性是++通过添加值并将其重新分配给变量来做两件事.


Geo*_*ive 7

JSLint友好循环

for (i = 0; i < 10; i += 1) {
    //Do somthing
}
Run Code Online (Sandbox Code Playgroud)