1.包装对象是什么?
var a = 100 这时候a的值是一个数字100
var b = new Number(100) 这时候b的值就是一个包装对象了,长下面这样 。数字的叫数字对象,字符串的叫字符串对象,布尔值的叫布尔值对象
这个PrimitiveValue里的就是原始值 ,就是new的时候传的值
【注意】只有Number,String,Boolean数据对象中存在原始值,数组函数对象这些数据类型是没有原始值的
2.为什么要有这个东西?
举个栗子 :var a=100 ; a.toString() ==>"100"
为什么a作为一个基本数据类型,可以.toString 呢?
因为系统内部做了一些处理:
① a=new Number(a)把a处理成数字对象,就像上面那样
② a.toString()这时候a作为一个对象,沿着原型链可以找到Object的原型对象,所以可以.toString()
③ a=a.valueOf() 这个valueOf可以拿到这个数字对象的原始值,就是把a再恢复原样
3.对象转基本值
同样的举个栗子,[1,2,3]+100=? 是不是懵啦 来看看叭
首先看这个表达式是不是在判等,如果是在判等(obj1===obj2这种),不需要转化,直接判地址
除此之外的运算都要转化,把对象转基本值
那就调用对象的valueOf方法,valueOf方法的本意是去拿包装对象的原始值,如果不是包装对象,那就会返回自身
valueOf返回自身的非包装对象,再去调用toString,不同的对象有自己的toString,所以返回的结果也不同
数组调用toString,去掉中括号,中间所有东西加引号
函数调用toString,函数体直接加引号
对象调用toString,默认值就是[object Object]
那来看上面举的栗子,[1,2,3]+100。不是判等,要把数组转成基本数据类型,[1,2,3].valueOf拿不到原始值,返回的还是[1,2,3],[1,2,3].toString的结果是"1,2,3","1,2,3"+100就变成了字符串拼接,最后的结果是" 1,2,3100 "