弱数据类型
js是弱数据类型语言,即它声明的变量,可以被赋值成不同类型的数据.
也就是说,同一个变量.我可以先是基础数据类型,然后马上被赋值成引用数据类型;也可以先是引用数据类型,然后被赋值成基础数据类型.
变量声明方式
1.直接声明并赋值
let a = '你好' console.log(a)//你好
2.new一个
let b =new String('你好') console.log(b,b.valueOf())//String{'你好'} 你好
装箱操作
简单来说就是将直接声明的变量再new一下,根据一个基础数据类型变量装箱成一个对应的类型对象
显式装箱
你只需要a的字符串值的时候,它就是一个基础数据类型,你想要知道这个字符串的长度的时候,你就封装成一个String对象
let a = '你好' console.log(a)//你好 let b =new String(a) console.log(b,b.length,b.valueOf())//String{'你好'} 2 你好
基础数据类型a------>和a对应的对象b
这么做是不是有点多此一举?你会这么觉得是因为js为你做了隐式装箱
隐式装箱
我之前的博客中有提到一个问题,基础类型数据为啥有属性
里面有讲到一点,基础数据类型数据在使用的过程中很多时候其实都被处理成了临时对象.我们用代码去理解一下
let a = '你好' console.log(a,a.length,a.valueOf())//你好 2 你好 let b =new String('你好') console.log(b,b.length,b.valueOf())//String{'你好'} 2 你好
所以,js觉得你只是想用a的字符串值了就不装箱,它觉得你需要装箱了就给你装箱.你只管用就行
let a = '你好' console.log(a.length)//2
其实就是
let tem = '你好' let a =new String(tem) console.log(a.length)// 2
拆箱操作
对象转成对应的基础数据类型
显式拆箱
let a =new String('你好') let b = a.toString() console.log(b)
隐式拆箱
let a =new String('你好') console.log(a+'我好')//你好我好
也是同样的道理,js觉得你需要拆了就给你拆,觉得你不需要拆了就不拆.