添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
没有腹肌的苹果  ·  convert sql server ...·  1 年前    · 
善良的牛肉面  ·  javascript - 如何让 ...·  2 年前    · 
细心的手电筒  ·  IDEA ...·  2 年前    · 
首发于 AE脚本
272、JS-i++和++i的区别

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);