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];
}
}
}
52946 次浏览

就个人而言,我更喜欢将诸如 i++这样的语句单独放在一行中。将它们作为一个更大的声明的一部分,可能会给那些不确定该行应该做什么的人造成困惑。

例如:

value = func(i++ * 3);

我会这样做:

value = func(i * 3);
i++;

这也意味着人们不必记住 i++++i是如何工作的,并且不需要应用这么多的偏好规则。

为了避免混淆,以及在使用小型化符时可能出现的问题,当与相同的(+ 或 -)一起使用时,总是将运算符及其操作数的括号括起来。

var i = 0, j = 0;
alert(i++ +j);

这会增加 i 和 j (并增加 i 作为副作用) ,结果是0被警告。

但是什么东西会有人出现并且移动空间呢?

var i = 0, j = 0;
alert(i+ ++j);

现在第一个递增 j,然后将 i 加到 j 的新值中,结果是1被警告。

这个问题很容易解决

var i = 0, j = 0;
alert((i++) +j);

这一点是不会错的。

长期以来的最佳实践是: 按照 jslint 的建议改用 i += 1

至于为什么这种做法比 ++更好,克罗克福德表示:

增量 ++和减量 --操作符使得以极其简洁的风格编写成为可能。在像 C 这样的语言中,它们使得编写一行代码成为可能: for (p = src, q = dest; !*p; p++, q++) *q = *p;大多数导致严重安全漏洞的缓冲区溢出错误都是由这样的代码引起的。在我自己的实践中,我发现当我使用 ++--时,我的代码往往太紧凑、太复杂、太神秘。所以,作为纪律问题,我不再使用它们了。

编辑: 包括来自 没有的评论,因为这个答案继续获得意见。

只需在 javascript 文件前面添加 /*jslint plusplus: true */即可。

有一种叫做前增量: + + i 和后增量 i + + 这两者是有区别的:

var i = 9;
alert(++i); //-> alerts 10


var j = 9;
alert(j++); //-> alerts 9
alert(j);   //-> alerts 10 now, as expected


var k = 9;
alert((k++)); //-> still alerts 9 even with extra parentheses

++算子的真正问题在于它是一个带有副作用的算子,因此它完全违背了函数式编程的原则。

实现 i++的“ 功能性的”方法是 i = i + 1,在这种方法中,您显式地重新分配变量,而且没有副作用,然后使用它。

混淆的可能性是 ++通过添加一个值并将其重新分配给变量来完成两件事情。

请注意,+ + 运算符依赖于前/后变量和换行/分号的位置来确定操作的顺序。

var a = 1;
var b = a++;
console.log(b); // b = 1
console.log(a); // a = 2


var a = 1;
var b = ++a;
console.log(b); // b = 2
console.log(a); // a = 2

JSLint 友好循环

for (i = 0; i < 10; i += 1) {
//Do somthing
}