从两段代码说起

var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;
var num4 = num1 + num2;
console.log(num1 +'-' + num2 +'-'+ num3 +'-' + num4)

将四个数分别打印是多少?

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;
var num4 = num1 + num2;
console.log(num1 +'-' + num2 +'-'+ num3 +'-' + num4)

这段代码运行之后将四个数分别打印又是多少?

如果你能果断地说出答案并且能自圆其说,那也就没必要继续看下去了。

递增运算符和递减运算符

我们都知道,JavaScript中的递增运算符是 ++,递减运算符是 --。简单来说,递增运算符就是将变量+1,递减运算符就是让变量-1,可是前置和后置结果是不一样的,也是很容易混淆的。

前置型递增(递减)

前置型简单理解就是先计算再赋值。例如

var a = 1;
var b = ++a;
console.log(a);  //2
console.log(b);  //2

上面的表达式也可以理解为:

var a = 1;
a = a + 1;
var b = a;

后置型递增(递减)

后置型简单理解就是先赋值再计算。例如

var a = 1;
var b = a++;
console.log(a);  //2
console.log(b);  //1

上面的表达式也可以理解为:

var a = 1;
var i = a;
a = a + 1;
var b = i;

原理

前置和后置型运算符之所以有上面的区别,是因为运算符的优先级。在各运算符按照优先级的不同由高到低排列顺序中:

  • 后置型递增(递减)运算符的优先级是17
  • 前置型递增(递减)运算符的优先级是16
  • 赋值运算符=的优先级是3

所以,++和--会优先于=执行。但是这边我自己也还有个疑问,前置型的还可以用优先级解释,但是后置型的怎么解释呢,讲道理它也比=的优先级高啊,这个我还有点疑问。

然后根据MDN上对递增(++)的解释:

  • 如果后置(postfix)使用,即运算符位于操作数的后面(如 x++),那么将会在递增前返回数值。
  • 如果前置(prefix)使用,即运算符位于操作数的前面(如 ++x),那么将会在递增后返回数值。

根据这个解释,在例子中

var a = 1;
console.log(a++)  //1

a++实际上是等于a递增之前的数值的,也就是1,这个在开发中容易被忽略,要谨记。

总结

回到最上面的代码,第一段代码分别会打印:1-20-21-21,第二段代码会打印:1-20-22-21

我们开发中需要记住的是:前置型是先计算再返回数值,后置型是先返回数值再计算。

参考文章

  • js中i++与++i的区别
  • JavaScript运算符:递增和递减

转载于:https://www.cnblogs.com/wancheng7/p/10283668.html

JavaScript运算符:递增递减运算符前置和后置的区别相关推荐

  1. (转)前置++和后置++的区别

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

  2. 前置++和后置++的区别

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

  3. JavaScript:递增递减运算符(全面解析)

    递增和递减运算符 递增和递减运算符概述 小结 递增和递减运算符概述 提示:这里可以添加本文要记录的大概内容: 如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减( – )运算符来完成. 在 ...

  4. C 语言里++前置和后置的区别

    在c语言中,++和+1基本相同,都是在原有变量上加上1,一下三条命令结果是相同的 b++ b=b+1 b+=1 在一行代码中,如果++前置,编译器首先执行++,再执行其他代码.如果++后置,编译器先执 ...

  5. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符

    1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...

  6. C++之运算符重载(前置++和后置++)

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

  7. C++回顾之前置++、后置++、不等号!及赋值运算符重载

    运算符重载的主要目的是为了让类对象能像普通数据类型一样能够进行加减乘除,自加自减等操作,非常直观方便.现在来回顾C++的自加减(分前置与后置)以及不等号非运算符,赋值运算符的重载. 1 ++重载 (1 ...

  8. c++中的前置和后置加加没你想的这么简单

    1.前置++和后置++的区别1: 前置是先加后赋值,后置是先赋值再加. 2.前置++比后置++运行的速度快: 在汇编底层中后置++会比前置++多一行. 当然我这demo不是很准确毕竟也是有偶然的,但是 ...

  9. javascript中基本包装、算数运算符、递增递减运算符、赋值运算符、比较运算符、逻辑运算符、运算符优先级

    基本包装类型: 指基本类型的数据变量通过调用属性或者方法包装成了复杂类型,这个变量也称为基本包装类型对象 <script>var str = 'hello';str = str.repla ...

最新文章

  1. c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法
  2. 【Network Security!】深入浅出ARP协议使用中间人截获密码
  3. XCode6报数组越界错误的问题
  4. SQL CTE学习总结
  5. 用 Arthas “庖丁解牛”
  6. Linux系统调用及用户编程接口(API)学习
  7. 用与非门设计血型配对电路_电路板中与非门集成电路的控制原理
  8. 【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
  9. AWK命令进行字符串替换-图解两个例子(转)
  10. PyCharm喜好设置
  11. ultilize什么意思_ultilize是什么意思
  12. Socket编程实践(6) --TCP服务端注意事项
  13. 学习日报 day02 java的语法骨架 myeclipse编辑java代码
  14. ReferenceError: XXX is not defined 错误及解决办法
  15. 五十步笑百步翻译软件测试,五十步笑百步
  16. 95-140-132-源码-transform-算子Join
  17. 【云周刊】第145期:2017天猫双11总交易额1682亿,背后阿里绝密50+技术揭秘!
  18. 大数据Hadoop学习记录(2)----基于Java语言的HDFS文件数据载入(判断文件是否存在、写入文本文件、上传本次文件到HDFS、读取HDFS文件内容)
  19. svn: E230001: Server SSL certificate verification failed: certificate issued for a different hostnam
  20. 分布式 - 公司使用什么RPC框架,聊聊你理解的RPC原理

热门文章

  1. nero 8 简体中文版能生成真正能用的序列号的注册机
  2. intel的linux证书过期,rhce证书过期了可以怎么办
  3. 安卓平台运行python_在 android 上运行 python 的方法
  4. gsonformat插件_IntelliJ IDEA18个常用插件,动图演示,让你效率翻倍!
  5. python如何并发上千个get_用greenlet实现Python中的并发
  6. scala mysql bit_Scala连接mysql数据库
  7. 零基础学怎么学Java_零基础学java难么?怎么自学?
  8. 自动化测试框架cucumber_基于Cucumber和Testng的WebUI自动化测试方法与流程
  9. 无刷电机真威武,一通操作猛如虎
  10. 2021年春季学期-信号与系统-第八次作业参考答案-第八小题