• 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原始值属性时候,用完即销毁,这样我们就不能手动为基本类型添加属性和方法了。

    【完】

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

  • 相关阅读:
    缓存Cache
    RDD的行动操作
    redis数据库的配置
    requests的封装(user-agent,proxies)
    phantjs
    python多线程
    etree-xpath
    Flask
    Flask
    Flask
  • 原文地址:https://www.cnblogs.com/tangjiao/p/10043210.html
Copyright © 2020-2023  润新知