下面的代码会产生内存泄露
var s=”lalala”;
alert(s.length)//可参考winter的《浏览器内在泄露》
《高效Javascript》捕捉到的详细说明:
Literal,如字符串、数字和布尔值在 ECMAScript 中有两种表示方法。 每个类型都可以创建变量值或对象。如 var oString = 'some content';
, 创建了字符串值,而 var oString = new String('some content');
创建了字符串对象。
所有的属性和方法都定义在 string 对象中,而不是 string 值中。每次使用 string 值的方法或属性, ECMAScript 引擎都会隐式的用相同 string 值创建新的 string 对象 (好家伙在这里做手脚了)。此对象只用于此请求,以后每次视图调用 string 值方法是都会重新创建。
看到这里似乎应该很相信后者的效率比前者要高了,但从时间上来讲,并非所有的浏览器都与opera表现一致
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<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();
//下面的代码将要求脚本引擎创建200001个新 string 对象,每次使用 length 属性时都会产生一个,每一个 charAt 方法也会产生一个
var s = str;
for( var i = 0; i < s.length; i++ ) {
s.charAt(i);
}
var date2 = +new Date();
alert("函数执行的时间为:"+(date2-date1) + "ms");
}
function fun2() {
var date1 = +new Date();
//下面的代码和上面相同,但只创建了一个对象,因此其效率更高??:
var s = new String(str);
for( var i = 0; i < s.length; i++ ) {
s.charAt(i);
}
var date2 = +new Date();
alert("函数执行的时间为:"+(date2-date1) + "ms");
}
</script>
</body>
</html>
浏览器 隐式转换所用时间 显示调用所用时间
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
上面的结果只能作为参考,我还是倾向于使用后一种方式进行开发,二者执行后的内存并无较大的差异
联系客服