大家好,我是 31 岁的小米。
写代码第 N 年,头发还在,但发际线已经开始对 JavaScript 有了自己的理解。今天这篇文章,我想聊一个几乎每天都在用、但又经常被低估的东西:
JavaScript 的加性操作符:+ 和 -。
别看它们简单。真正踩坑,往往就从这些“最基础”的地方开始。
故事从一家咖啡馆开始
想象这样一个场景。我在一家咖啡馆打工,名字叫 JavaScript。这家店有两个“老员工”:
- 一个叫 加号 +
- 一个叫 减号 -
看起来很普通,对吧?但只要你在这家店多待一会儿,就会发现:这俩人性格完全不一样。
加法操作符:看起来是加法,实际是“变脸大师”
1、在数学世界里,加号很单纯
在你心里,加号是什么?
没毛病。在 JavaScript 里,当 + 面对两个数字 时,它非常老实:
这时候的 +,就是你小学数学里的那个加号。
规则一:如果两个操作数都是 Number,加号执行数值加法。
2、一旦字符串进场,加号立刻“变脸”
问题从这里开始。有一天,一个叫 字符串 的顾客走进了咖啡馆。
你以为它会算出 3?不。它端出来的是:
为什么?因为在 JavaScript 里:只要加号一侧出现字符串,加号就会变成“拼接符”。
在 JavaScript,加号的潜台词是:“只要你是字符串,我就陪你一起当字符串。”
3、隐式类型转换:加号最擅长的魔术
加号真正让人头疼的,不是拼接本身,而是隐式类型转换。
比如下面这些:
你第一眼看是不是有点懵?我们拆开看。
(1)布尔值
所以:
(2)null
于是:
(3)undefined:问题制造机
于是:
一旦参与运算的是 NaN,结果永远是 NaN。
4、加号最经典的面试陷阱
来,我们做几道 JS 面试题。
面试题 1
结果是?
"532"
为什么?
- "5" + 3 → "53"
- "53" + 2 → "532"
面试题 2
结果是?
"55"
为什么?
- 3 + 2 → 5
- 5 + "5" → "55"
加号是从左到右执行的。
面试题 3(经典中的经典)
结果是?
""(空字符串)
原因是:
- [] 转字符串是 ""
- "" + "" = ""
减法操作符:一个“原则性极强”的人
和加号比起来,减号在 JavaScript 是个非常有原则的人。它只有一句话:
我不拼接,我只做数学。
1、减号永远是数值运算
不管你给它什么,减号都会说一句话:“先给我变成 Number。”
在减号眼里,没有字符串,只有数字。
2、减号遇到非数字:直接 NaN
因为:
3、减号与特殊值
是不是发现了一个规律?减号和加号在“数值转换规则”上是一样的,但减号没有字符串拼接的特权。
加号 vs 减号:性格对比表
真实业务中的“加减惨案”
场景 1:金额计算
你以为是 120,结果页面上展示的是 10020。
老板看了沉默,产品看了流泪。
场景 2:表单数据统计
如果 v.value 是字符串?恭喜你,total 会在某一刻变成字符串,从此一去不复返。
生存建议(非常重要)
1. 数值计算前,主动转换
不要指望 JS 替你做“正确”的隐式转换。
2. 字符串拼接,请用模板字符串
可读性比 a + b 高太多。
3. 面试时,永远先分析类型
看到 +,第一反应不是算结果,而是问自己一句话: “这里有没有字符串?”
总结
在 JavaScript 里:
-
- 是一个情绪化的艺术家
-
- 是一个冷静的理工男
它们看起来简单,却藏着 JavaScript 最核心的设计哲学之一:动态类型 + 隐式转换。
真正厉害的前端、全栈、Node 工程师,不是没踩过坑,而是见到 + 和 -,心里已经开始自动推演转换规则。
END
如果你能把这两个操作符吃透,后面的比较操作符、逻辑操作符、隐式转换体系,都会顺得多。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
好朋友们,我们下篇见。