类型系统与V8拆箱装箱机制¶
强类型语言与弱类型语言¶
- 强类型语言:在声明变量时,需要指定变量的类型
- 弱类型语言:在声明变量时,可以无需指定变量的类型
js就是标准的弱类型语言
装箱¶
当一个原始数值需要被当做对象处理时,会进行装箱操作。例如、当调用一个数字的方法(如.fixed())的时候,或者将一个数字存储在一个只能存储对象的地方(比如Map的键或者Set的元素时),V8会创建一个表示该数值的对象。这个过程就是装箱。如下
(2).toString();// '2'
2.toString();// typeError
2 .toString();// '2'
// 可以仔细比较下后两个的区别
拆箱¶
拆箱是指从对象中获取原始数值的过程,当 V8 需要对数值进行数学运算或其他不需要对象特性的操作时,它会尝试从对象中提取原始数值。如果可能的话,V8 会尽可能保持数值为 Smi 格式,以提高性能。
原理:会先通过使用valueOf()方法获取对象的原始数值,当原始数值不存在时,通过调用toString方法转换为String类型再去进行操作。比如
[].valueOf() = []
[].toString = ''
{}.valueOf() = {}
{}.toString = '[Object,Object]'
例子:
[]+[] //''
[]+{} //"[Obejct,Obejct]"
{}+[] // 0 这里等于0的原因,因为{}在js中有两种解释,一种是当做对象字面量,一种是当做对象,当{}放在前面时是会被当做代码块进行解析的。所里这里就是+[]的含义= +''= 0