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

    【完】

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

  • 相关阅读:
    Kafka入门经典教程【转】
    利用shell找出15分钟内修改的文件
    MySQL性能剖析工具(pt-query-digest)【转】
    Python3安装配置【转】
    查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息【转】
    linux通过sendmail发送邮件
    crontab每10秒钟执行一次
    shell expect的简单用法【转】
    linux中Shell标准输出错误 >/dev/null 2>&1 分析【转】
    Ansible 插件 之 【CMDB】【转】
  • 原文地址:https://www.cnblogs.com/tangjiao/p/10043210.html
Copyright © 2011-2022 走看看