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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM