Fork me on GitHub

String,Number和Boolean等基本类型的包装对象

JavaScript的数据类型被分为两大类:引用类型和基本类型。

基本类型:Undefined,Null,Boolean,Number,String,Symbol(ES6新标准出现的数据类型,表示独一无二的值)。

引用类型:Object,Array,Date,RegExp等,你想的没错,引用类型就是对象。

我们都知道引用类型(即对象)都有属性和方法的,而基本类型是木有的,对吧。但是你一定见到过和下面相似的代码:

var s="text";
var s2=s.charAt(1);
alert(s);//e    

例子中的s是String类型,也就是基本类型,但是s却可以调用出charAt()方法来,这是为什么呢?

主要是因为在基本类型中,有三个比较特殊的存在就是:String Number Boolean,这三个基本类型都有自己对应的包装对象。并且随时等候召唤。包装对象呢,其实就是对象,有相应的属性和方法。下面来个栗子:

var s="text";
var s2=s.charAt(1);//解析器在解析到这句代码的时候就会在后台执行下面的代码
(//()里面的程序是在后台执行的;
    var s=new String("text");//后台用new来创建了一个基本类型相同的对象
    var s2=s.charAt(1);//然后通过新创建的对象来调用charAt()方法,并且返回给s2
    s=null//调用完成之后就把这个对象给销毁了
)//实际上这个操作是在一瞬间就完成的,实际上我们没有改变字符串本身的值
alert(s);//e    

由此我们可以知道,引用类型和基本包装对象的区别在于:生存期

引用类型所创建的对象,在执行的期间一直在内存中,而基本包装对象只是存在了一瞬间。

所以我们无法直接给基本类型添加方法:

var s="text";//创建一个字符串
s.length=4;//给它设置一个 属性值
(//()里面的程序是在后台执行的;
    var s= new String("text"); //后台用new来创建了一个基本类型相同的对象
    var s.length=4;//通过这个对象调用包装对象下的方法 但结果并没有被任何东西保存 因为这个对象马上要被销毁了
    s=null;//对象s又被销毁了;
)
var l=s.length;//查询这个属性
alert(l);//undefined
alert(s.length)//undefined
(
    var s= new String("text"); //后台用new来创建了一个基本类型相同的对象
    var s.length=undefined;//因为包装对象下面没有number这个属性,所以又会重新添加,因为没有值,所以值是未定 ;然后弹出结果
    s=null;//对象s又被销毁了;
)    

当我们要给基本类型加上属性和方法时,我们要在基本包装对象的原型上添加的:

//给字符串添加方法  要写到对应的包装对象的原型下才行
var s="text";
String.prototype.last= fuction(){ 
return this.charAt(this.length);
}; 
s.last();
(
   var str = new String('hello');// 找到基本包装对象,new一个和字符串值相同的对象,
   str.last();  // 通过这个对象找到了包装对象下的方法并调用 
   str =null; //  这个对象被销毁
)
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!