javascript 加减操作符中的类型转换

为什么 1 + “1” 不等于 2,”5” - 2 等于 3?

1
2
3
4
5
// 为什么不等于 2
1 + "1" // "11"

// 为什么等于 3
"5" - 2 // 3

解答这个问题,我们必须了解 +(Addition Operator)和 -(Subtraction Operator) 的工作原理

加号操作符 The Addition operator

直接上文档

  • If Type(lprim) is String or Type(rprim) is String, then
    a. Return the String that is the result of concatenating ToString(lprim) followed by ToString(rprim)
  • Return the result of applying the addition operation to ToNumber(lprim) and ToNumber(rprim)

可以看到文档中写的很清楚,如果在加号的两边有一边是 string 类型,那么相加的时候,两边都会转化成 string,进行字符串拼接(string concatenation),如果加号两边都是 number 类型,则进行数字相加运算(numeric operands)

MDN 上关于 Addition Operator 操作符号的相关介绍

The addition operator produces the sum of numeric operands or string concatenation.

PS:如果加号两边有 boolean 值的话,该 boolean 值会被转化为 0 或 1,如

1
true + 5 // 6

减号操作符 The Subtraction Operator

文档

  • Let lnum be ToNumber(lval).
  • Let rnum be ToNumber(rval).
  • Return the result of applying the subtraction operation to lnum and rnum

可以看到减号操作符会把左右两边都转为 number 类型进行运算

1
2
"5" - 2 // 3
5 - "2" // 3

5 + +”5” 为什么等于 10

这里字符串前面的加号是 Unary + Operator

关于 Unary + Operator 的介绍:

The production UnaryExpression : + UnaryExpression is evaluated as follows:

  1. Let expr be the result of evaluating UnaryExpression.
  2. Return ToNumber(GetValue(expr)).

下面的表达式可拆分为两个步骤,首先对 + 右边的表达式进行求值,然后将返回的结果转化为数字

1
2
3
+"5" // 5

+function(){return "5"}() // 5