日期:2014-05-16 浏览次数:20463 次
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());