资讯专栏INFORMATION COLUMN

关于前置++和后置++

crelaber / 2244人阅读

摘要:语句返回值在浏览器内直接写代码,每条语句之后都会有返回值,如下关于为什么语句都有返回值,其实里面每条语句都有返回值,你只是没有在意。我觉得,只要知道每条语句都是有返回值的就足够了。

好久不写博客了,主要因为忙于找实习,以及沉迷看书。其实如果时间不忙,有好多技术博客想分享。

问题

可以试着执行如下语句:

var a = 1;
++a++;   //ReferenceError

没错,会报错。请允许我先写两个简单的知识点,再写具体原因。

优先级

后置++的优先级大于前置++优先级,这就是语法规则。

语句返回值

在浏览器内直接写代码,每条语句之后都会有返回值,如下:

关于为什么var语句都有返回值,其实JavaScript里面每条语句都有返回值,你只是没有在意。我觉得,只要知道每条语句都是有返回值的就足够了。另外规范中定义,a = b这种赋值语句,返回值是后者,我以前的文章中,在文章最后有证明的代码。

原因

好了,赶紧说原因。
优先级,后置++高,先执行a++,你也看到了上面的图片,a++会返回一个数,就是1。
那么之后就是执行++1,这就是报错的根本原因。
当你尝试引用一个未被定义的变量时,将会抛出一个 ReferenceError 。
++1执行时,会把1看成是一个变量,自然1没被声明过,而且1根本就是一个数值类型数据,根本不是变量,因此报错。

大一时候,学C语言,b = a++ ;是怎么执行的呢?
我的C语言老师说,先执行b = a ; 然后a++;
坑啊!真的坑啊!
其实,b = a++;就是先执行a++,此时就是a已经加上一了,只不过为什么赋值后,b的值仍旧是之前未加一的a,是因为a++的返回值就是之前的a。
因此,a++就是一步执行完的,绝不是先b等于之前的a。
我在Java下测试过,这个报错原因也是可以用上面这个原因分析的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107998.html

相关文章

  • 关于前置自增后置自增的有趣小测试

    摘要:能知道为什么这样吗注意后面的,可以发现最后一个括号不论是加不加后置自增,计算结果一样,但是最后的值改变了 var i= 5; var j = 5; var p = (i++)+(i++)+(i++); var q = (++j)+(++j)+(++j); document.write(i+); // 8 ...

    h9911 评论0 收藏0
  • JDK动态代理的理解与分析

    摘要:类所实现的方法包装了对被代理对象的反射调用,后文中的动态代理类正是调用此方法来调用被代理对象的方法。 前言 java的设计模式中有一项设计模式叫做代理模式,所谓代理模式,就是通过代理方来操作目标对象,而不是自己直接调用。代理又分为静态代理和动态代理,静态代理就是针对每个被代理对象写一个代理类,操作不够优雅;动态代理,可以根据接口动态的生成代理类,这动态生成的类不需要自己书写,jdk帮你...

    stormjun 评论0 收藏0
  • 前端优化-Javascript篇(1.脚本放在底部)

    摘要:从本篇博客开始,我会跟大家分享下我关于前端优化方面的学习,由于时间原因每篇博客只能分享一小点内容,一点点深入前端优化的细节。在前端优化这个问题上,最被大家熟知的应该就是雅虎前端优化条军规以及雅虎前端优化条规则。   从本篇博客开始,我会跟大家分享下我关于前端优化方面的学习,由于时间原因每篇博客只能分享一小点内容,一点点深入前端优化的细节。  做过前端的人都知道,前端优化是一个永远都不会...

    JerryC 评论0 收藏0

发表评论

0条评论

crelaber

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<