这里主要关注的是值类型和引用类型。
我们知道在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
时间: 2024-10-04 23:43:46