说到对象,大家可能对于它的概念是再熟悉不过了,但是提及到包装对象,相信这里理解这个名字的朋友就会减少很多,我自己第一次看到这个概念的时候也是有点懵,后来通过一位小姐姐的博客和相关书籍理解了这个名字的含义,现在就来总结一下。
说到这个就要提及js的两大类数据类型,基本类型和引用类型
- 基本类型: undefined, null, NaN, Boolean, String, Number
- 引用类型: Object, Date, Array, RegExp
这两种类型中,基本类型就是数据类型的一个抽象,我们都知道基本类型是没有属性和方法的。而引用类型,说白了就是对象,具体点儿就是经过封装处理的对象,它是具有属性和方法的,但是你在实际的开发中,一定会见过这样的代码
var s = "hello world!";
var word = s.substring(s.indexOf(" ")+1,s.length);
上面的变量s毫无疑问是一个基本类型,但是有拥有自己的方法substring,这就要引入包装对象这个概念来解决这个问题了。在js中,有三个基本类型都有自己的包装对象,分别是String,Number,Boolean。包装对象其实就是对象,并且有相应的属性和方法,在某种程度上,和我们所认识的ADT(抽象数据类型)有点相似,他和一般对象的区别就是,它运作的时候会在后台偷偷进行一系列的操作,去完成相应的操作,而且它是临时的,在操作完成之后会被销毁。
var s = "test";
s.len = 4;
console.log(s.len); //输出为undefined
在运行这段代码的时候,最后输出的值为undefined,也就是说我们为s创建的一个新的属性消失了,大部分朋友可能不能理解,我们现在就来解析一下这段代码背后到底发生了什么。
var s = "test";
s.len = 4;
(
var temp = new String("test"); //通过类型判断声明一个相应的包装对象
temp.len = 4; //为包装对象新添加len属性并赋值
temp = null; //销毁包装对象
)
console.log(s.len); //undefined
程序在执行到第二行代码的时候,为s创建了一个临时的包装对象,并为其设置新属性len并赋值,随即就销毁了这个对象,第三行通过原始的字符串去访问这个属性,因为原有的包装对象已经被销毁,所以就会输入undefined。
存取字符串、数字或布尔值的属性时创建的临时对象称为包装对象,它只是偶尔用来区分字符串和字符串对象等,通常包装对象只是被看作一种实现细节,而不用特别关注。由于字符串、数字和布尔值的属性都时只读的,不能给它们定义新属性,这也是他们和普通对象的根本区别。当然,我们也可以通过String(),Number(),Boolean()去显式地创建这些对象并对他们进行一般对象能进行的操作。
var s = new String("hello world!");
s.len = 4;
console.log(s.len); //输出为4
在这段代码中,我们显式创建了一个String对象,可以对其像对普通对象一样进行操作,这里还需要注意的一点就是,我们通过String()创建的对象和原有的字符串是可以进行比较的,而且用“==”进行比较他们两者是相等的,而用"==="比较显示为不相等。
var s = "hello world!";
var S = new String(s);
console.log(s == S); //输出为true
console.log(s === S); //输出为false
关于基本包装对象的介绍就到这里了,希望有写的不好的地方大佬能站出来指导指导,以后我还会和大家一起分享一些js的学习心得,我是七代目火影,一个想当歌手的程序猿QVQ。