一元正号(+)和一元负号(-)运算符通过 tonumber 规则隐式转数字:+x 等价于 number(x),如 +"123"→123、+null→0、+"abc"→nan;-x 先转再取反,如 -"123"→-123、-null→-0;数组/对象会先 tostring 再转换,易得 nan。

一元正号(+)和一元负号(-)运算符在 JavaScript 中会尝试将操作数转换为数字,这个过程遵循 JavaScript 的 ToNumber 抽象操作规则。
一元正号 +:最常用的隐式转数字方式
它不改变数值符号,但会触发强制类型转换:
-
+"123"→123(字符串数字 → number) -
+""→0(空字符串 → 0) -
+" 42 "→42(自动忽略首尾空白) -
+"abc"→NaN(无法解析的字符串 → NaN) -
+null→0(null 显式转为 0) -
+undefined→NaN -
+true→1,+false→0(布尔值转为 0/1)
一元负号 -:先转数字再取反
它等价于 -(+x),即先执行一元正号转换,再加负号:
-
-"123"→-123 -
-""→-0(注意:-0 在 JS 中是合法值,Object.is(-0, 0)为 false) -
-"42.5"→-42.5 -
-"abc"→NaN(因为+"abc"是NaN,再取负仍是NaN) -
-null→-0 -
-true→-1
和 Number() 的关系
一元正号的行为与 Number(x) 完全一致,是它的简写形式。例如:
-
+"42" === Number("42")→true -
+null === Number(null)→true -
+" 0x10 "→16(支持十六进制字符串) -
Number(" 0x10 ")同样得16
注意事项与常见陷阱
虽然方便,但需警惕隐式转换带来的意外结果:
- 数组会先调用
.toString():例如+[1,2]→+"1,2"→NaN;+[]→+""→0 - 对象默认转为
"[object Object]",再转数字 →NaN - 空格过多或含非数字字符(如
"12px")都会返回NaN,不会像parseInt那样截断 - 如果需要容错解析,应优先用
parseInt(str, 10)或parseFloat(str),而非一元运算符
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











