日期:2014-05-16 浏览次数:20368 次
ECMAScript 的字符串是不可变的,传统的字符串连接性能特别差:
var str = "hello"; str += "world";
?这段代码在幕后执行的步骤如下:
(1) 创建存储 "hello " 的字符串。
(2) 创建存储 "world " 的字符串。
(3) 创建存储连接结果的字符串。
(4) 把 str 的当前内容复制到结果中。
(5) 把 "world " 复制到结果中。
(6) 更新 str ,使它指向结果。
每次完成字符串连接都会执行步骤 2 到 6 ,使得这种操作非常消耗资源。
?
可以用 prototype 属性为任何已有的类定义新方法,就像处理自己的类一样
<script type="text/javascript"> function StringBuffer(){ this.string = new Array; //创建Array对象存储字符串 } StringBuffer.prototype.append = function(str){ //把参数str附加到字符串数组 this.string .push(str); } StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串 this.string.join(""); } </script>
?
性能测试代码:
<SCRIPT LANGUAGE="JavaScript"> var date1 = new Date(); var str = ""; for(i = 0; i<10000; i++){ str += "nomad"; } var date2 = new Date(); alert(date2.getTime() - date1.getTime());//getTime()日期的毫秒表示 date1 = new Date(); var strBuffer = new StringBuffer(); for(i = 0; i<10000;i++){ strBuffer.append("nomad"); } var result = strBuffer.toString(); date2=new Date(); alert(date2.getTime()-date1.getTime()); </SCRIPT>
?奇怪的事情出现了:
IE下:输出282? 和 79
FF下:输出15 和 63
截然相反!!!
?
原因是FF的JS引擎已经对字符串的拼接运算“+”做了特别优化
?
StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串 this.string.join(""); }
StringBuffer.prototype.append = function(str){ //把参数str附加到字符串数组 this.string .push(str); } alert(new StringBuffer()); StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串 this.string.join(""); } alert(new StringBuffer());