包装类、包装(类)对象、包装类的类型转换功能
本文案的主要目的就是区分:包装类、包装类对象、使用包装类进行类型转换,这三者
在叙述前首先区分三者间的关系(因为在复习过程中,发现自己傻傻分不清):
1.包装类:
JS提供了三个包装类——Boolean、String、Number
这儿不是基本数据类型中的boolean、string、number。上述是包装类,是对象
2.包装(类)对象:
使用new Boolean/String/Number()创建的对象即为包装类对象
3.包装类的类型转换功能:
当不通过new运算符调用这些这些函数时,它们便作为类型转换函数。如:Number(‘3’)——将字符串类型转换为数字类型
new Boolean/String/Number()得到的是对象,是引用类型;而包装类作为类型转换函数时,得到的是基本类型的一个值,不是对象
包装(类)对象
- 隐式创建包装对象
我们经常会这样操作字符串:
var str = 'ZhongGuoMei';
var len = str.length;
那么,问题是:字符串只是一个基本类型的数,并非对象,为什么能够获取他的length属性呢?
这是因为:只要读取了str的属性,那么JS就会在后台(隐式的)通过new String(str)的方式将str转换为一个包装对象。从而便可以读取该属性了!但是,一旦属性读取结束,这个隐式创建的包装对象便会被销毁
总结:
只要对基本数据类型中的string/number/boolean这几个类型进行读取或写入属性操作,那么都会调用各自对应的包装类,通过new的方式隐式地创建一个包装对象。同时,一旦读取或写入操作执行完毕,包装对象会被立即销毁
var str = 'ZhongGuoFan';
str.nb = 11;//相当于new String(str).nb = 11;
console.log(str.nb);//undefined
因为在执行str.nb是会创建包装对象new String(str)–>然后向该包装对象中写入属性nb–>写入操作执行完毕,销毁包装对象,所以输出undefined
- 显示创建包装对象
即直接用new创建:
var str = '残暴的欢愉终将以残暴结束',
num = 100,
bool = true;
var S = new String(str),
N = new Number(num),
B = new Boolean(bool);
还有一点应该留意:在创建包装类对象时,如果实际传入的参数类型与期待的参数类型不相符,则传入的参数会在内部隐式的进行类型转换(这些隐式的类型转换都是通过下面讲的‘类型转换函数完成的’)。例如:
var Num = new Number('123BGM');
上述代码中,Number的参数期待传入的应该是一个number类型,但是却是一个string类型。此时,便会在内部隐式的调用Number(注意,此时Number是作为类型转换函数使用的)将其转换为number类型,然后再创建包装对象。
当然,创建其他包装对象时同理
‘==’运算符将原始值与其包装对象视为相等
包装类的类型转换功能
在将Number/String/Boolean做为类型转换函数使用时,遵循如下规则:
除上述表格外,Number作为类型转换函数时还应注意下列问题:
1.在通过Number将字符串转换为数字时,允许字符串的开始与结尾带有若干空格,在进行转换时,这些空格将会被忽略
2.字符串中的非数字字符(除两头的空格外)会导致Number的转换结果为NaN。如:’123er’、‘123 78’
3.Number转换的结果是一个十进制数。如:Number(0x123)=291
ps:本文案参考了以下书籍
《JavaScript权威指南》