這里主要關注的是值類型和引用類型。
我們知道在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