打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JS内置对象(1)
Javascript 解析,格式化日期
编程语言基于javascript 显式转换与隐式转换(详解)_javascript技巧
jquery easyui datebox 的使用 .
JavaScript trim函数大赏
JS基础-内置对象【字符串+Date+Math】
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服