jslint工具的一个提示是:
++和——
++(递增)和——(递减)
众所周知,操作符会导致糟糕的代码
鼓励过度狡诈。他们
仅次于有缺陷的架构
使病毒和其他
安全威胁。这是一个加分项
选项,禁止使用这些
操作符。
我知道PHP结构像$foo[$bar++]可能很容易导致off-by-one错误,但我想不出一个更好的方法来控制循环比:
while( a < 10 ) do { /* foo */ a++; }
or
for (var i=0; i<10; i++) { /* foo */ }
jslint突出显示它们是因为有一些类似的语言缺少“++”和“——”语法或处理方式不同,还是有其他避免“++”和“——”的理由,我可能忽略了?
考虑以下代码
int a[10];
a[0] = 0;
a[1] = 0;
a[2] = 0;
a[3] = 0;
int i = 0;
a[i++] = i++;
a[i++] = i++;
a[i++] = i++;
由于i++被求值两次,因此输出为
(from vs2005调试器)
[0] 0 int
[1] 0 int
[2] 2 int
[3] 0 int
[4] 4 int
现在考虑下面的代码:
int a[10];
a[0] = 0;
a[1] = 0;
a[2] = 0;
a[3] = 0;
int i = 0;
a[++i] = ++i;
a[++i] = ++i;
a[++i] = ++i;
注意,输出是相同的。现在你可能认为++i和i++是一样的。他们不是
[0] 0 int
[1] 0 int
[2] 2 int
[3] 0 int
[4] 4 int
最后考虑下面的代码
int a[10];
a[0] = 0;
a[1] = 0;
a[2] = 0;
a[3] = 0;
int i = 0;
a[++i] = i++;
a[++i] = i++;
a[++i] = i++;
现在的输出是:
[0] 0 int
[1] 1 int
[2] 0 int
[3] 3 int
[4] 0 int
[5] 5 int
所以它们是不一样的,两者混合会导致不那么直观的行为。我认为for循环适用于++,但当你在同一行或同一指令上有多个++符号时要小心
在循环中,它是无害的,但在赋值语句中,它会导致意想不到的结果:
var x = 5;
var y = x++; // y is now 5 and x is 6
var z = ++x; // z is now 7 and x is 7
变量和操作符之间的空格也会导致意想不到的结果:
a = b = c = 1; a ++ ; b -- ; c; console.log('a:', a, 'b:', b, 'c:', c)
在闭包中,意外的结果也可能是一个问题:
var foobar = function(i){var count = count || i; return function(){return count++;}}
baz = foobar(1);
baz(); //1
baz(); //2
var alphabeta = function(i){var count = count || i; return function(){return ++count;}}
omega = alphabeta(1);
omega(); //2
omega(); //3
它会自动在换行后插入分号:
var foo = 1, bar = 2, baz = 3, alpha = 4, beta = 5, delta = alpha
++beta; //delta is 4, alpha is 4, beta is 6
增量前/增量后的混淆会产生差一的错误,这很难诊断。幸运的是,它们也是完全不必要的。给变量加1有更好的方法。
参考文献
JSLint帮助:增加和减少操作符