首页 > 代码库 > Javascript中String()与new String()的差异

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

 

Javascript中String()与new String()的差异