zoukankan      html  css  js  c++  java
  • Javascript中String()与new String()的差异

      这里主要关注的是值类型和引用类型。

      我们知道在javascript中的变量在内存中的存储有两种形式,值类型存储和引用类型存储。

      通常可以进行值存储的包括  字符串类型,布尔值类型,数字类型,他们都包含了字面量表示形式,如下:

    var str='str';
    var bool=true;
    var num=11;

    这里定义的变量是直接在地址中存值的,而常用的数组(其实也属于对象)和对象也有字面量,不过是引用存储,即内存中存储的是对应数据的地址(不是本文重点)。

    接着我们探究String()和new String()的差异

    var str1=String('str1');
    str1.aa='hello';
    console.log('str1.aa:',str1.aa);//str1.aa: undefined
    
    
    var str2=new String('str2');
    str2.aa='world';
    console.log('str2.aa:',str2.aa);//str2.aa: world

    内存引用的变量归根结底都是object,是可以设置值和取值的(要产生设置值和取值不同,除非定义了getter和setter,没那么巧吧?)

    通过上面的测试,发现String()直接使用返回的是值存储,而new String()  返回的是引用存储,即 返回的是一个对象(这是很合理的啊,new 出来的都是对象嘛,呵呵)。

    给出另一个测试方式

    var Fun1=function(){
        return String('str1');
    };
    
    var Fun2=function(){
        return new String('str1');
    };
    
    console.log('Fun1 output:',new Fun1());//Fun1 output: {}
    console.log('Fun2 output:',new Fun2());//Fun2 output: [String: 'str1']

    这个测试主要是根据constructor 的return ,如果是对象的话,就会直接把对象结果返回替换当前对象,而如果是值则忽略。

    同理证明 Boolean() 和 Number();

    var boolVal1=Boolean(true);
    boolVal1.aa='hello';
    console.log('boolVal1.aa:',boolVal1.aa);//boolVal.aa: undefined
    
    
    var booVal2=new Boolean(true);
    booVal2.aa='world';
    console.log('booVal2.aa:',booVal2.aa);//booVal2.aa: world
    
    
    var numVal1=Number(1);
    numVal1.aa='hello';
    console.log('numVal1.aa:',numVal1.aa);//boolVal.aa: undefined
    
    
    var numVal2=new Number(1);
    numVal2.aa='world';
    console.log('numVal2.aa:',numVal2.aa);//numVal2.aa: world
  • 相关阅读:
    wenbao与manacher
    wenbao与拓扑排序
    wenbao与邻接表
    wenbao与最短路floyd
    wenbao与最短路dij
    wenbao与后缀自动机(SAM)
    wenbao与欧拉回路
    wenbao与字符串Hash
    wenbao与后缀数组
    wenbao与扩展kmp
  • 原文地址:https://www.cnblogs.com/chianquan/p/6075925.html
Copyright © 2011-2022 走看看