Javascript中String()和new String()的区别——JS的包装对象

最近在看Symbol不能使用new操作符,然后类比到Number,String,Boolean,因为它们同属于基本类型,但是有有所差异:Number,String,Boolean是可以使用new操作符进行实例的输出的。出个题:

var abc = 'abc',
    str1 = String(abc),
    str2 = new String(abc);
//判断下面输出
str1 === abc   //true
str2 === abc   //false

这里其实考察的是值类型和引用类型,String()返回的是字符串,即基本类型,而new String()返回的是一个对象,str2是引用存储,值存储 !== 引用存储的。

再来个题目:

var Fun1=function(){
    return String('miya');
};
var fun1 = String('miya')
fun1 === new Fun1()   //false
fun1 === Fun1()         //true

其实下面fun1 === Fun1()   这个肯定是true了,因为返回都是基本类型string,但是new出来的对象就不一样了,它返回的是引用类型了。

 存取字符串,数字或者布尔值的属性时创建的临时对象称作包装对象。

var str = "miya",num = 1,boo = true;
var Str = new String(str);
var Num = new Number(num);
var Boo = new Boolean(boo);
console.log(str == Str);  //true
console.log(num == Num);   //true
console.log(Boo == boo); //true

当使用全等时候str !== Str的,因为前者原始值,后者引用引用类型。使用==时候为true,是因为:Javascript会在必要时候将包装对象转化为原始值。

Javascript中三种基本包装类型:Boolean,Number,String。

当调用str.substring(0)  //"miya",实际上JS内部隐式的帮我们创建了一个包装对象,调用substring方法时候实际过程是:

var a1 = new String("miya");
var a2 = a1.substring(0);
a1 = null;
console.log(a2);  //miya

这个是在基本类型string调用属性时候浏览器隐式创建的包装对象。隐式创建的对象,在使用完毕后会被销毁掉。

隐式包装对象和自己显示创建的包装对象差别点在于:

对象的生存周期,你用new操作符创建的引用类型的实例,一直保存在内存中除非手动销毁,而浏览器隐式创建的包装对象只存在于你操作string,boolean,number原始值属性时候,用完即销毁,这样我们就不能手动为基本类型添加属性和方法了。

【完】

 书卷多情似故人,晨昏忧乐每相亲。