建议8:谨慎使用运算符(3)
要确保变量a的值为连续运算,可以使用小括号逻辑分隔符强迫4个数值先进行连续运算,然后再赋值。
- a = (1, 2, 3, 4);
- alert(a); //4
当使用var关键字来定义变量时,会发现a最终没有返回值。 - var a = 1, 2, 3, 4;
- alert(a); //null
要确保var声明的变量正确返回连续运算的值,需要使用小括号先强迫数值进行计算,最后再把连续运算的值赋值给变量a。 - var a = (1, 2, 3, 4);
- alert(a); //4
4.警惕运算符的副作用
JavaScript运算符一般不会对运算数本身产生影响,如算术运算符、比较运算符、条件运算符、取逆、“位与”等。例如,a = b + c,其中的运算数b和c不会因为加法运算而导致自身的值发生变化。
但在JavaScript中还有一些运算符能够改变运算数自身的值,如赋值、递增、递减运算等。由于这类运算符自身的值会发生变化,在使用时会具有一定的副作用,特别是在复杂表达式中,这种副作用更加明显,因此在使用时应该时刻保持警惕。例如,在下面代码中,变量a经过赋值运算和递加运算后,其值发生了两次变化。
- var a;
- a = 0;
- a++;
- alert(a); //1
再如: - var a;
- a = 1;
- a = (a++)+(++a)-(a++)-(++a);
- alert(a); //-4
如果直观地去判断,会错误地认为返回值为0,实际上变量a在参与运算的过程中,变量a的值是不断发生变化的。这种变化很容易被误解。为了方便理解,进一步拆解(a++)+(++a)–(a++)–(++a)表达式: - var a;
- a = 1;
- b = a++;
- c = ++a;
- d = a++;
- e = ++a;
- alert(b+c-d-e); //-4
如果表达式中还包含其他能够引起自身值发生变化的运算,那么整个表达式的逻辑就无法用人的直观思维来描述了。因此,从代码可读性角度来考量:在一个表达式中不能够对相同操作数执行两次或多次引起自身值变化的运算,除非表达式必须这样执行,否则应该避免产生歧义。这种歧义在不同编译器中会产生完全不同的解析结果。例如,下面的代码虽然看起来让人头疼,但由于每个运算数仅执行了一次引起自身值变化的运算,所以不会产生歧义。 - a = (b++)+(++c)-(d++)-(++e);