在JavaScript中,有时候会遇到以下两种情况
- 基本类型的变量, 直接调用方法
var item = 1234 item.toString() // '1234' var num = 123; num.toFixed(2) // '123.00'
众所周知只有Object类型才有方法,那上述代码基本类型为什么也可以调用方法,其中涉及到JavaScript的装箱。
装箱的概念:把基本类型转化为相应的对象。而装箱又分为显式与隐式
上述代码就是典型的隐式装箱:
- 读取基本类型的值,后台创建一个临时的该基本类型所对应的对象。
- 对基本类型调用方法,实际是在该基本类型的对象上调用方法。
- 执行方法后该对象立马销毁。
var item = 1234 item.toString() // '1234' // 此代码等价于 var item = new Number(1234); item.toString(); var num = 1234; num.toFixed(2) // '1234.00' // 此代码等价于 var num = new Number(1234) num.toFiexed(2)
显式装箱:用内置对象例如Number、Boolean、String、Object等 对基本类型进行显式装箱
var bool = new Boolean(true)
var Str = new String('123')
2.把引用类型的值当做基本类型的值来使用,这里面涉及到拆箱操作,拆箱是把引用类型转化为基本类型
var num = [1, 2, 3, 4]
var obj = {
name: 'wsd'
}
console.log(num + 1) // 1,21
console.log(str.toString()) // [object Object]
拆箱内部过程是调用了一个抽象方法toPrimitive(val, type),该方法第一个参数接收转换的参数,第二个参数非必须,为对象被期待转换的类型。
这个方法的本质是:
- 如果val是object,则会先执行valueOf()方法,如果结果为原始值,则返回此结果;
- 否则再调用tostring方法;如果得出结果为原始值,则返回结果,否则抛出异常
var num = [1, 2, 3, 4] console.log(num + 1) // 1,21 //先执行valueOf()方法 num.valueOf() // [1, 2, 3, 4] //结果不是原始值,再调用toString方法 num.valueOf().toString() // 1,2,3,4 // 得到基本类型数据 console(num + 1) // '1,2,3,4' + 1 = '1,2,3,41'