272、JS-i++和++i的区别
为了说清楚这个问题,我们借用c语言中的概念。
一、基本概念
1、变量
i 是个整形变量
2、运算符
++是运算符,它的功能是对变量进行自增。
3、表达式
i++ ++i都是表达式,但是它们是不一样的。
二、区别
1、++对变量的影响
第一个例子:
var i=10;
i++;
alert(i)//11
第二个例子:
var i=10;
++i;
alert(i)//11
结论:对于变量i来讲,不论是左侧自增++i还是右侧自增i++,效果是一样的,都等于i=i+1这个赋值语句的功能。
2、++对表达式的影响
第一个例子:
var i=10;
alert(i++)//10
第二个例子:
var i=10;
alert(++i)//11
c语言中的表达式是从左向右运算的,出现在变量左侧的++运算符的优先级大于出现在变量右侧的++,所以++i这个表达式先对变量进行自加运算,然后把计算的结果作为++i这个表达式的值,运算后表达式++i的值和变量的值是一致的;而i++这个表达式是先取变量的值作为表达式的结果,然后再对i进行自加运算,因此表达式的值是变量i的原来的值,运算后表达式i++的值和变量的值是不一致的,前者比后正好差1。
在c语言中的代码:
// 前缀形式:
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
*this += 1; // 增加
return *this; // 取回值
//后缀形式:
const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
int oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值
结论:对于表达式来说,++i的值和变量i的值相同,i++的值和变量i的值不同,且前者比后者刚好差1。
三、应用
1、常规应用
function forEach(array, callBack) {
for (var index = 0, length = array.length; index < length; index++) {
callBack(array[index], index, array);
或者:
function forEach(array, callBack) {
for (var index = 0, length = array.length; index < length; ++index) {
callBack(array[index], index, array);
二者的作用是一样的,因为这里只有变量index参与了运算,表达式index++或者++index,并没有参与运算。
2、反常规应用
感谢无名分享的代码:

function _arrayEach(array, iteratee) {
var index = -1;
var length = array.length;
while (++index< length) iteratee(array[index], index, array);