分享

关于《高效Javascript》中”避免隐式对象的转换“的疑问

 actinia 2011-05-12

下面的代码会产生内存泄露

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./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www./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

上面的结果只能作为参考,我还是倾向于使用后一种方式进行开发,二者执行后的内存并无较大的差异

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多