一、加法
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/,如有侵权,请联系删除。