一、加法

1. String 类型的加法

| 1
2

| ‘123’ + ‘456’
‘’ + ‘123’ // “123”

| | —- | —- |

String 类型相加时,效果是字符串拼接。


2. String 与 Number 的加法

| 1
2

| 123 + ‘’ // “123”
‘123’ + 0 // “1230”

| | —- | —- |

Number 类型的数据会被转换成字符串,再进行字符串拼接。

  • 转换方向:Number -> String

3. String 与 Boolean 的加法

| 1
2

| true + ‘’ // “true”
true + ‘123’ // “true123”

| | —- | —- |

Boolean 类型的数据会被转换成字符串,再进行字符串拼接。

  • 转换方向:Boolean -> String

4. String 与 undefined 的加法

| 1
2

| undefined + ‘’ // “undefined”
undefined + ‘123’ // “undefined123”

| | —- | —- |

undefined 会被转换成字符串,再进行字符串拼接。

  • 转换方向:undefined -> String

5. String 与 null 的加法

| 1
2

| null + ‘’ // “null”
null + ‘123’ // “null123”

| | —- | —- |

null 会被转换成字符串,再进行字符串拼接。

  • 转换方向:null -> String

6. Number 与 Boolean 的加法

| 1
2

| 12 + true // 13
12 + false // 12

| | —- | —- |

Boolean 会被转换成 0 或 1,再进行数字运算。

  • 转换方向:Boolean -> Number

7. Number 与 undefined 的加法

| 1

| 12 + undefined // NaN

| | —- | —- |

undefined 在 ToNumber 规则里,会被转换为 NaN。

  • 转换方向:undefined -> Number

8. Number 与 null 的加法

| 1

| 12 + null // 12

| | —- | —- |

null 在 ToNumber 规则里,会被转换为 0。

  • 转换方向:null -> Number

9. Boolean 与 null 的加法

| 1

| true + null // 1

| | —- | —- |

true 在 ToNumber 规则里,会被转换为 1。
null 在 ToNumber 规则里,会被转换为 0。

  • 转换方向:Boolean、null -> Number

10. Boolean 与 undefined 的加法

| 1

| true + undefined // NaN

| | —- | —- |

true 在 ToNumber 规则里,会被转换为 1。
undefined 在 ToNumber 规则里,会被转换为 NaN。

  • 转换方向:Boolean、undefined -> Number

11. null 与 undefined 的加法

| 1

| null + undefined // NaN

| | —- | —- |

null 在 ToNumber 规则里,会被转换为 0。
undefined 在 ToNumber 规则里,会被转换为 NaN。

  • 转换方向:null、undefined -> Number

加法总结

加法中的类型转换优先顺序:(对象除外)

  • 两个加数中,若存在 String,优先转成 String。
  • 两个加数中,若不存在 String,优先转成 Number。

二、减法

1. 含 String 的减法

| 1
2
3
4

| ‘123’ - ‘’ // 123
‘123’ - ‘23’ // 100
‘abc’ - ‘’ // NaN
‘abc’ - ‘23’ // NaN

| | —- | —- |

String 会通过 ToNumber 规则转换成数字,再进行数字运算。

  • 转换方向:String -> Number

2. 含 Boolean 的减法

| 1

| true - 0 // 1

| | —- | —- |

Boolean 会通过 ToNumber 规则转换成 0 或 1,再进行数字运算。

  • 转换方向:Boolean -> Number

3. 含 undefined 的减法

| 1

| undefined - 0 // NaN

| | —- | —- |

undefined 会通过 ToNumber 规则转换成 NaN,再进行数字运算。

  • 转换方向:undefined -> Number

4. 含 null 的减法

| 1

| null - 0 // 0

| | —- | —- |

null 会通过 ToNumber 规则转换成 0,再进行数字运算。

  • 转换方向:null -> Number

减法总结

减法中的类型转换优先顺序:(包括对象)

  • 减数和被减数都会通过 ToNumber 规则转成数字,再进行运算。

三、含对象的加减法

普通对象的加减法:

| 1
2
3

| var obj = {}
obj + 1 // “[object Object]1”
obj + ‘’ // “[object Object]”

| | —- | —- |

数组对象的加减法:

| 1
2

| [1,2] + [3, 4] // “1,23,4”
[1,2] - [3, 4] // NaN

| | —- | —- |

  • 对于对象的加减运算(或者其它算式运算,乘除运算),结果由对象的 valueOf 和 toString 共同决定,如: | 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    | var a = {
    valueOf(){
    return 123
    }
    }
    a + ‘’ // “123”
    a + 1 // 124

var b = {
toString(){
return 456
}
}
b + ‘’ // “456”
b + 1 // 457

var c = {
valueOf(){
return 123
},
toString(){
return 456
}
}
c + ‘’ // “123”
c + 1 // 124

| | —- | —- |

如果 valueOf 的返回值不是对象,则 valueOf 优先,否则 toString 优先:

| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

| var a = {
valueOf(){
return 123
},
toString(){
return 456
}
}
a + 0 // 123

var b = {
valueOf(){
return {}
},
toString(){
return 456
}
}
b + 0 // 456

| | —- | —- |

乘除运算大多是(ToNumber 规则)转换成数字再运算的。这里就一笔带过了

本文转自 https://www.dazhuanlan.com/2019/10/28/5db5cdcc01256/,如有侵权,请联系删除。