1. 类型系统定义
对机器语言来说,所有的数据都是二进制代码,cpu处理时没有类型的概念,仅仅移动数据,比如对其进行移位,相加或相乘。高级语言中,会对操作的数据赋予指定的类型。

JS语言不需要指定变量的类型,因为虚拟机会根据数据自动推导出类型。通用类型有数字,字符串,布尔,undefined, null, object等。
一门语言的类型系统定义了各种类型之间应该如何相互操作,比如,两种不同类型的数据相加如何处理,不同类型的数据如何转换等等。
2. V8怎么执行加法操作
a + b
V8如何执行加法操作,V8会严格根据ECMAScript规范来操作。大致操作是V8会提供一个ToPrimitive原生方法,作用是将a和b转成原生数据类型。转换流程如下:
- 先检查该对象中是否存在valueOf方法,如果有并返回了原始类型,就使用该值进行强制类型转换。
- 如果valueOf没有返回原始类型,那么就使用toString方法的返回值。
- 如果valueOf和toString两个方法都没有返回基本类型值,就会触发TypeError错误。

原始值相加的时候,如果一项是字符串,V8会默认将另外一个值也转换成字符串,然后做字符串的拼接。如果是其它格式,则相加的值会转换为数字类型值,然后数字相加。
Number(a).toString + 'b'
var Obj = {
toString() {
return '200'
},
valueOf() {
return 100
}
}
Obj+3
// Obj先调用valueOf()返回100,100+3=103
// 103
var Obj = {
toString() {
return '200'
},
valueOf() {
return 100
}
}
Obj+'3'
// Obj先调用valueOf()返回100,与字符串相加,则隐式转换成字符串
// 1003
3. 总结
V8在执行加法的过程中,V8会先通过ToPrimitive原生方法,将对象转换成原生的字符串或是数字。在转换过程中,优先调用对象的valueOf(),如果没有就调用toString(),如果valueOf()和toString()都没有返回基本类型值,就触发TypeError错误。
如果相加的值当中有字符串,那其他的值也会转换为字符串类型,然后做拼接操作。