在写代码的过程中总是不可避免的会遇上代码副作用。然而不同语言的副作用有可能都不一样。这里举出一些Javascript的需要注意的副作用。很多副作用都发生在一元操作符里面,因为它不单单运算出期望的结果值,而且还会改变变量本身。
比较一下下面这两个式子,有C经验的人应该很容易就看出来了。
1. example1
> var x = 100
undefined
> z = ++x + 2 * x
303
2. example2
> var x = 100
undefined
> z = x++ + 2 * x
302
第一个 ++x 返回的是相加后的值101, 而赋值操作右手边的式子是左结合的。也就是说x先进行了加1 运算,然后 2 * x。然后再加起来。而第二个中 x++返回的是加一运算前的值。所以然后再跟 2 * x 的值相加(这里的x是递增后的x),所以最后两条式子的结果是有所不同的。
再来个比较奇葩的例子:
> i = 0
0
> vdata = [1,2,3,4,5,6,7]
[ 1, 2, 3, 4, 5, 6, 7 ]
> vdata[i++] *= 2
2
> vdata
[ 2, 2, 3, 4, 5, 6, 7 ]
> i = 0
0
> vdata = [1,2,3,4,5,6,7]
[ 1, 2, 3, 4, 5, 6, 7 ]
> vdata[i++] = vdata[i++] * 2
4
> vdata
[ 4, 2, 3, 4, 5, 6, 7 ]
第一个操作始终操作的是vdata[0] 这个值, 展开之后就是vdata[0] = vdata[0] * 2;而第二个值操作的是(由于是从左到右进行的操作)所以有 vdata[0] = vdata[1] * 2; 赋值操作右边引用的是下标1.由于在赋值操作左边已经进行了加一操作了。
Happy Coding!!