减号(-)和乘号(*)在javascript中强制执行tonumber转换:操作数从左到右转数字,任一失败即返回nan;空字符串→0、null→0、undefined→nan、数组先tostring再tonumber;与加号不同,二者无字符串拼接路径,必须走数值计算。

减号(-)和乘号(*)在 JavaScript 中不支持字符串拼接,只要出现就一定会尝试把操作数转成数字再计算。这个过程是自动的、不可跳过的,背后调用的是 JS 内部的 ToNumber 抽象操作。
减号和乘号的数字转换逻辑
这两个运算符对操作数的处理方式完全一致:从左到右,依次将每个操作数用 ToNumber 转为数字,任一失败就返回 NaN,整个表达式结果即为 NaN。
-
"5" - "2"→ 先把两个字符串转为5和2,再相减得3 -
"10" * 2→"10"转为10,再乘2得20 -
null * 5→null转为0,结果是0 -
undefined - 1→undefined转为NaN,结果直接是NaN -
"42px" * 2→"42px"无法解析为有效数字,转为NaN,结果仍是NaN
哪些值能成功转成数字
理解常见原始值的 ToNumber 行为,能预判结果:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 空字符串
""→0 - 带空格的数字字符串如
" 42 "→42(自动 trim) -
true→1,false→0 -
null→0 -
undefined→NaN - 空数组
[]→ 先转字符串"",再转数字 →0 - 单元素数组
[1]→ 转字符串为"1",再转数字 →1 - 多元素数组
[1,2]→ 转字符串为"1,2",无法转数字 →NaN
和加号(+)的关键区别
加号是唯一有“双路径”的算术运算符:遇到字符串就走拼接;其余一律走数值路径。而减、乘、除、取余没有拼接选项,只要出现,就强制走数字路径。
-
"3" + 2→"32"(拼接) -
"3" - 2→1(必须转数字) -
"3" * 2→6(必须转数字) - 哪怕写成
2 - "3"或"3" * "2",也一样先转数字再运算
实际开发中的建议
别依赖隐式转换做关键逻辑,尤其涉及用户输入或接口数据时:
- 用
Number()或一元加号+str显式转数字,更清晰可控 - 对可能为空或非法的字符串,先用
isNaN()或正则校验再运算 - 避免写
value * 1这类“取巧”写法——它确实能转数字,但语义模糊,可读性差 - 调试时遇到
NaN,优先检查参与运算的每个值是否真能被ToNumber接受










