您的位置:首页 > Web前端 > JavaScript

好好学一遍JavaScript 笔记(三)——StringBuffer、prototype

2011-12-13 16:18 567 查看
欢迎技术交流。 QQ:138986722

javaScript中的String的、拼接:

与其他语言类似、ECMAScript的字符串是不可变的、即它们的值不能改变。考虑下面的代码:

var str = "hello";
str += "world";
实际上,这段代码在幕后执行的步骤如下:

1、创建存储"hello"的字符串。

2、创建存储"world"的字符串。

3、创建存储连接结果的字符串。

4、把str的当前内容复制到结果中。

5、把"world"复制到结果中。

6、更新str、使它指向结果。

如果重复这一过程次数较多、就会造成性能问题。

解决方法是用Array对象存储字符串、然后用join()方法(参数是空字符串)创建最后的字符串:

var arr = new Array;
arr[0] = "hello";
arr[1] = "world";
var str = arr.join("");
此时、执行步骤如下:

1、创建存储结果的字符串。

2、把每个字符串复制到结果中的合适位置。

更好的解决办法可以使用StringBuffer类打包该功能:

function StringBuffer(){
			this._string_ = new Array;
		}
		StringBuffer.prototype.append = function(str){
			this._string_.push(str);
		};
		StringBuffer.prototype.toString = function(){
			return this._string_.join("");
		};
		
		/**由于javaScript没有公私(有)属性的区别、这样声明string只是为了标识它本意是私有属性。
		   测试一下StringBuffer对象和传统的字符串连接方法的性能:
		*/
		
		var d1 = new Date();  
		var str = "";  
		
		for(var i =0 ; i < 10000; i++){
			str +="性能测试"; 
		}
		var d2 = new Date();
		document.write("加号连接:<font color='red;'>"+(d2.getTime()-d1.getTime())+"</font> 所用时间");
		
		
		var oBuffer = new StringBuffer();
		d1 = new Date();
		for(var i =0 ; i < 10000; i++){
			oBuffer.append("性能测试");    
		}
		var sREsult = oBuffer.toString();  
		   
		d2 = new Date();
		document.write("<br/>StringBuffer连接:<font color='red;'>"+(d2.getTime()-d1.getTime())+"</font> 所用时间");


IE6测试结果:

加号连接:2094 所用时间

StringBuffer连接:47 所用时间

结果显而易见、但是如果数据量不是非常大、完全没有必要这样做

但是用IE8跟360、谷歌这些浏览器测试结果又完全不同

应该是javaScript对传统的""+""方法进行了优化、

毕竟这个示例是很老很老的了出自————《javascript高级程序设计》

谷歌浏览器测试:

加号连接:0 所用时间

StringBuffer连接:2 所用时间

百度了很久、木有什么好的结果

看来以后写连接优化还要注意浏览器呀

不过现在估计用IE6的很少很少了吧!!! 也希望了解情况的大侠看到给解释解释!!!感激不尽!!!

/**
		 * 查询数组中是否存在某个元素
		 * @param {Object} sValue 元素值 
		 * @memberOf {TypeName} 
		 * @return {Int} 返回-1则说明不存在、否则返回该元素在数组中的索引值 
		 */
		Array.prototype.indexOfHzw = function (sValue){
			for(var i=0; i < this.length; i++){
				if(sValue == this[i]){
					return i ;
				}
			}
			return -1;
		}    
		var array = new Array("red","blue","yellow","fuck");
		alert(array.indexOfHzw("fuck"));


<script type="text/javascript">
	
		/**
		 * 创建新方法
		 */
		Object.prototype.showValue = function(){
			alert(this.valueOf());       
		};   
		var str = "hello";
		var iNum = 26;   
		str.showValue(); 
		iNum.showValue(); 
		
		
		/**
		 * 从定义已有方法
		 */
		Function.prototype.toString = function (){
			return "从定义方法";
		};
		function fTry(){
			alert("Try");
		}
		alert(fTry.toString());
	</script>


看来prototype很给力!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: