大家好,我是小米,今年 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++)
执行顺序是:
- 先返回 a 的原值
- 再对 a 进行 +1
前置递增(++a)
执行顺序是:
- 先对 a 进行 +1
- 再返回新的值
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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!