jslint工具的一个提示是:

++和—— ++(递增)和——(递减) 众所周知,操作符会导致糟糕的代码 鼓励过度狡诈。他们 仅次于有缺陷的架构 使病毒和其他 安全威胁。这是一个加分项 选项,禁止使用这些 操作符。

我知道PHP结构像$foo[$bar++]可能很容易导致off-by-one错误,但我想不出一个更好的方法来控制循环比:

while( a < 10 ) do { /* foo */ a++; }

or

for (var i=0; i<10; i++) { /* foo */ }

jslint突出显示它们是因为有一些类似的语言缺少“++”和“——”语法或处理方式不同,还是有其他避免“++”和“——”的理由,我可能忽略了?


当前回答

在我看来,“显性总是比隐性好。”因为在某些时候,你可能会对这个increments语句y+ = x++ + ++y感到困惑。一个好的程序员总是使他或她的代码更易于阅读。

其他回答

我的观点是在一行中单独使用++和——,如下所示:

i++;
array[i] = foo;

而不是

array[++i] = foo;

在我看来,任何超出这个范围的事情都会让一些程序员感到困惑。For循环是一个例外,因为增量操作符的使用是惯用的,因此总是明确的。

我认为在两种情况下应该避免使用:

1)当你有一个在很多行中使用的变量,你在使用它的第一个语句(或者最后,或者更糟糕的是,在中间)上增加/减少它:

// It's Java, but applies to Js too
vi = list.get ( ++i );
vi1 = list.get ( i + 1 )
out.println ( "Processing values: " + vi + ", " + vi1 )
if ( i < list.size () - 1 ) ...

在这样的例子中,您很容易忽略变量是自动递增/递减的,甚至会删除第一个语句。换句话说,只在非常短的块中使用它,或者变量只出现在块中的几个结束语句中。

2)在同一语句中出现多个关于同一个变量的++和-的情况。很难记住在这样的情况下会发生什么:

result = ( ++x - --x ) * x++;

考试和专业测试会询问类似上述的例子,事实上,我在寻找其中一个的文档时偶然发现了这个问题,但在现实生活中,人们不应该被迫对一行代码考虑这么多。

我一直在看Douglas Crockford关于这个的视频他对不使用递增和递减的解释是

在过去的其他语言中,它被用来打破数组的界限,并导致各种各样的坏和 它更令人困惑,没有经验的JS开发人员不知道它到底是做什么的。

首先,JavaScript中的数组是动态大小的,因此,如果我说错了,请原谅我,在JavaScript中使用这种方法不可能打破数组的界限并访问不应该访问的数据。

其次,我们是否应该避免那些复杂的东西,当然问题不在于我们有这个工具,而在于有些开发者声称要做JavaScript,但不知道这些操作符是如何工作的?这很简单。Value ++,给我当前的值,在表达式之后加1,++ Value,在给我它之前增加值。

像a ++ + ++ b这样的表达式,只要记住上面的内容,就很容易计算出来。

var a = 1, b = 1, c;
c = a ++ + ++ b;
// c = 1 + 2 = 3; 
// a = 2 (equals two after the expression is finished);
// b = 2;

我想你只需要记住谁需要通读代码,如果你有一个对JS了如指掌的团队,那你就不用担心了。如果不是,那么评论它,以不同的方式写它,等等。做你该做的。我不认为递增和递减本身就不好,或者产生错误,或者产生漏洞,可能只是根据你的读者的不同,可读性更差。

顺便说一句,我认为道格拉斯·克罗克福德是一个传奇,但我认为他引起了很多恐慌,因为他是一个不值得的操作员。

我活着就是为了证明我是错的……

另一个例子,比其他一些简单的递增值返回更简单:

function testIncrement1(x) {
    return x++;
}

function testIncrement2(x) {
    return ++x;
}

function testIncrement3(x) {
    return x += 1;
}

console.log(testIncrement1(0)); // 0
console.log(testIncrement2(0)); // 1
console.log(testIncrement3(0)); // 1

如您所见,如果希望此操作符影响结果,则不应在return语句中使用后递增/递减操作。但是return不会“捕获”自增/自减操作符:

function closureIncrementTest() {
    var x = 0;

    function postIncrementX() {
        return x++;
    }

    var y = postIncrementX();

    console.log(x); // 1
}

++的参数是,++不适用于会导致TypeError的字符串,这几乎总是可取的。