下面的代碼會(huì )產(chǎn)生內存泄露
var s=”lalala”;
alert(s.length)//可參考winter的《瀏覽器內在泄露》
《高效Javascript》捕捉到的詳細說(shuō)明:
Literal,如字符串、數字和布爾值在 ECMAScript 中有兩種表示方法。 每個(gè)類(lèi)型都可以創(chuàng )建變量值或對象。如 var oString = 'some content';, 創(chuàng )建了字符串值,而 var oString = new String('some content');創(chuàng )建了字符串對象。
所有的屬性和方法都定義在 string 對象中,而不是 string 值中。每次使用 string 值的方法或屬性, ECMAScript 引擎都會(huì )隱式的用相同 string 值創(chuàng )建新的 string 對象 (好家伙在這里做手腳了)。此對象只用于此請求,以后每次視圖調用 string 值方法是都會(huì )重新創(chuàng )建。
看到這里似乎應該很相信后者的效率比前者要高了,但從時(shí)間上來(lái)講,并非所有的瀏覽器都與opera表現一致
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<html xmlns="<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body>
<button onclick="fun1()">隱式轉換</button>
<button onclick="fun2()">顯示調用</button>
<script type="text/javascript">
var str = [];
for(var i=0;i<100*100*10;i++) {
str.push(i);
}
str = str.join("");
function fun1() {
var date1 = +new Date();
//下面的代碼將要求腳本引擎創(chuàng )建200001個(gè)新 string 對象,每次使用 length 屬性時(shí)都會(huì )產(chǎn)生一個(gè),每一個(gè) charAt 方法也會(huì )產(chǎn)生一個(gè)
var s = str;
for( var i = 0; i < s.length; i++ ) {
s.charAt(i);
}
var date2 = +new Date();
alert("函數執行的時(shí)間為:"+(date2-date1) + "ms");
}
function fun2() {
var date1 = +new Date();
//下面的代碼和上面相同,但只創(chuàng )建了一個(gè)對象,因此其效率更高??:
var s = new String(str);
for( var i = 0; i < s.length; i++ ) {
s.charAt(i);
}
var date2 = +new Date();
alert("函數執行的時(shí)間為:"+(date2-date1) + "ms");
}
</script>
</body>
</html>
瀏覽器 隱式轉換所用時(shí)間 顯示調用所用時(shí)間
IE7(xp sp3) 1329ms 1922ms
chrome(4.1) 27ms 81ms
FF(3.5.8) 13ms 860ms
Safari(3.2.2) 287ms 233ms
Opera(10.0) 422ms 203ms
上面的結果只能作為參考,我還是傾向于使用后一種方式進(jìn)行開(kāi)發(fā),二者執行后的內存并無(wú)較大的差異
聯(lián)系客服