a++ 和 ++a 的区别,90% 的人都说不清

33 阅读5分钟



大家好,我是小米,今年 31 岁。如果你问我,学 JavaScript 这么多年,哪一类语法最容易被低估,却又最容易坑人?

我一定会毫不犹豫地回答你:操作符,尤其是一元操作符。

别看它名字简单,写法短小,只有一个操作数,看起来像是“新手福利”。但如果你真的在项目里踩过坑,就会发现它更像是那种“表面老实,背后出手极狠”的角色。

从一个加班夜说起:一元操作符登场

故事发生在一个普通的加班夜。

那天晚上,我正在给一个老系统做维护。页面上有个统计逻辑,看起来很简单:

我心里想:“没毛病啊,count++,结果肯定是 2。”

结果一跑,确实是 2。我刚准备关电脑,突然脑子里冒出一个念头:“那如果我改成 ++count 呢?”

还是 2。我当时笑了笑:“一元操作符嘛,不就这么回事。”

直到第二天,一个同事发来一句话:“小米,你昨天那段代码,在某些情况下结果不对。”

那一刻我才意识到:一元操作符,从来不是表面那么简单。

什么是一元操作符?它到底“单”在哪?

我们先从定义说起。

1、什么是一元操作符

在 JavaScript 里,一元操作符(Unary Operator) ,指的是:只需要一个操作数,就能完成运算的操作符

不像加法 a + b、乘法 a * b 那样需要左右两个值,一元操作符只对一个值动手

常见的一元操作符包括:

  • ++ 递增
  • -- 递减
    • 一元加
    • 一元减
  • typeof
  • !
  • ~
  • delete
  • void

但今天,我们重点聊三个最容易踩坑、也最常用的:

  • 递增 / 递减操作符
  • 一元加
  • 一元减

2、一个形象的比喻

如果把 JavaScript 世界比作一家咖啡馆:

  • 二元操作符:像“情侣套餐”,必须两个人一起点
  • 一元操作符:像“单人浓缩咖啡”,一个人就能喝,但后劲很大

递增 / 递减操作符:++ 和 --

1、它们到底干了什么?

递增和递减操作符,本质只干一件事对变量的数值进行 +1 或 -1 操作

但问题在于:它们有两种写法,而且行为完全不同。

2前置 vs 后置:这是事故高发区

后置递增(a++)

执行顺序是:

  1. 先返回 a 的原值
  2. 再对 a 进行 +1

前置递增(++a)

执行顺序是:

  1. 先对 a 进行 +1
  2. 再返回新的值

3、用生活类比一下

把变量想象成一个排队买奶茶的人

  • a++:先让他拍照存档,再让他往前走一步
  • ++a:先让他往前走一步,再拍照存档

4、表格总结(建议收藏)

5、隐藏陷阱:字符串也能 ++?

你以为 JS 会报错?不,它只是悄悄帮你做了类型转换。内部逻辑其实是:

如果字符串无法转成数字呢?

这类问题,在表单数据、接口返回值中非常常见。

一元加:看起来没用,其实是神器

1、一元加到底是干嘛的?

一元加的核心作用只有一个:把操作数转换成 Number 类型。 它和 Number() 的作用几乎一致。

2、为什么我这么喜欢一元加?

因为它:

  • 写法极短
  • 性能稳定
  • 在老代码里非常常见

如果没有一元加:

3、一元加 vs Number()

小结一句话:一元加更“严格”,不容忍杂质。

4、在真实项目中的使用场景

  • URL 参数
  • 表单输入
  • localStorage 取值
  • 后端返回字符串数字

这一行代码,在我项目里出现过无数次。

一元减:不只是取负数那么简单

1、基本用法

是的,一元减 也会触发类型转换

2、它和一元加的关系

你可以把一元减理解成:

所以:

3、一个很容易被忽略的细节

你看到的不是错别字,而是:

  • 第一个 -:二元减法
  • 第二个 -:一元减

JS 解析时是从右往左的。

为什么一元操作符这么重要?

说句掏心窝子的话。很多人学 JavaScript 的时候:

  • 重视框架
  • 重视语法糖
  • 重视 API

忽略了操作符的细节。而真实世界的 Bug,往往就藏在这些看似不起眼的地方。

给正在学 JS 的你三条建议

1、递增递减不要乱用在复杂表达式里

这种代码,未来的你一定会骂现在的你。

2、表单和接口数据,优先显式转数字

比隐式转换靠谱得多。

3、把一元操作符当成“工具”,不是“炫技”

写给人看的代码,比写给 JS 引擎看的更重要。

总结

很多年后我再回头看,会发现:

JavaScript 的难,不在于它复杂,而在于它太“宽容”。

一元操作符就是这种宽容的典型代表。它不吵、不闹、不报错,只是默默地帮你做了决定。

而你,必须清楚它到底做了什么。

END

如果这篇文章对你有帮助,欢迎点赞、在看、转发给那个曾经被 ++ 搞懵的朋友。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!