JavaScript中跨类型通用运算下“1”- -”1”结果为2的原因解析
JavaScript
"1" - - "1" 运算返回2的执行规则 很多开发者初次接触这个表达式时,会因为两个相邻的减号产生认知偏差,可直接按照JS语法解析流程逐层推导结果逻辑:
词法结构拆分
JS词法分析结合语法上下文判定后,该表达式的结构可等价写为:
"1" - ( - "1" )
组成部分分别为:
- 左操作数:字符串类型的
"1" - 二元减法运算符:两个值中间的第一个减号,负责执行减法计算
- 右操作数:一元负号运算符作用于字符串
"1"的整体运算结果。一元负号优先级高于二元减法,会优先完成自身逻辑计算
运算流程拆解
JS中减法属于纯算术类运算符,执行前会对所有操作数执行ToNumber抽象转换,不会触发字符串拼接逻辑,这和加法运算符遇到字符串时优先执行拼接的行为存在本质区别。
按优先级从高到低计算:
- 先处理最高优先级的一元负号逻辑:将操作数
"1"按ToNumber规则转换为数字1,再对其取反得到计算值-1 - 原表达式此时已转换为纯数字算术运算:
1 - (-1) - 执行基础减法计算,最终得到结果
2
认知误区澄清
- 此处两个相邻的减号不会组合成自减运算符:自减运算符需要紧贴操作数书写(如
a--、--a),该表达式的结构不符合自减的语法要求,不会触发自减逻辑 - 不要混淆加减运算符的类型转换规则:仅加法运算符会在任意操作数为字符串时优先触发拼接,减法、乘法、除法、取模等其余算术运算符,无论操作数原始类型是什么,都会强制将所有值转换为数字后再计算
可通过同逻辑的表达式验证规则一致性: "3" - - "2"等价于3 - (-2),返回5"100" - "20"等价于100 - 20,返回80null - - true等价于0 - (-1),返回1
类型转换补充规则:JS中null经ToNumber转换为0;布尔值true转换为1、false转换为0
内容的提问来源于stack exchange,提问作者Elham Ajdari
相关产品推荐
相关产品推荐

