日期:2014-05-16  浏览次数:20387 次

JavaScript底层数据组织实现方式
近一段时间以来,一直比较关注JavaScript相关的东西。

学的多了以后就变得很想提个为什么。

JS相关的书籍,基本市面上有的我都有收藏,看了十几本以后感觉最满意的有2本。
一本是《JavaScript DOM 高级编程艺术》、还有就是国人大师级人物周爱民写的《JavaScript精髓》。前一本适合想做JS框架的人看,后一本适合想做JS引擎的人看。。


说了很多废话之后还是回到今天的题目:底层数据组织和实现方式。

用周爱民的话说JS中只有一种数据类型就是对象,我们通常所说的方法,也就是我们在脚本中定义的function也是一种对象,对象只有一种操作就是“读取”,我们通常看到的调用比如:
function test(){....};
test();

这种形式提示也只是使用到了JS对象的读取操作,加上括号的另外一种语义。

当然这些和今天的题目比较不靠谱所以先不深入说了。

今天提到的JS底层数据组织实现方式是我看完这么多书、实际编写完JQuery插件后得到的一种感悟,当然尚未在市面上任何一本书上得到过证实。。。

我感觉在JS中只有2中数据类型,一种是原始类型、一种是数组类型。除此之外再无别。


为什么这么说呢?

我们知道数组分为2种类型:一种是顺序数组、一种是哈希数组。

顺序数组就是通常我们建立的new Array()这种类型的数组,这种类型的数组在底层,数据时按顺序存在于内存当中。我们只需要依照数据下标就可以取得数组的内容。
比如var test = ['a','b']; alert(test[0]);
我们可以看到a被显示出来。


哈希数组是JS中使用最频繁的一种数组组织方式,可以说大部分JS的特性和效果都是利用的哈希数组的特性。比如:我们最常使用的JSON数组格式。

JSON数组格式类似于JS中的对象字面量也类似于JS对象。
var test = {test:"a",value:"b"}
这里就是一个JSON对象,你也可以说成是一个JS对象或者一个JS的对象字面量。
它的主要结构就是key和value。而这些东西在JS底层都是使用哈希数组实现的。

再比如JS中的命名空间的概念。

命名空间被广泛使用在框架的开发中,我们在开发一个JS框架时不可避免的要注意一个问题就是我们在框架中定义的方法是否和其他框架方法冲突,我们在框架中使用的全局变量是否和其他框架中的全局变量冲突。如何解决这个问题呢?我们就是使用命名空间。

比如:
(function(){
	window['IC']={}
	
	function $(){
		var elements = new Array();
		for(var i=0;i<arguments.length;i++){
			var element = arguments[i];
			
			if(typeof element == 'string'){
				element = document.getElementById(element);
			}
			
			if(arguments.length==1){
				return element;
			}
			elements.push(element);
		}
		return elements;
	}
	window['IC']['$']=$;
	
	function getElementsByClassName(className,tag){
		
		var allTags = document.getElementsByTagName(tag);
		var matchingElements = new Array();

		className = className.replace(/\-/g, "\\-");
		var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
		
		var element;

		for(var i=0; i<allTags.length; i++){
			element = allTags[i];
			if(regex.test(element.className)){
				matchingElements.push(element);
			}
		}
		

		return matchingElements;
		
	}
	
	window['IC']['getElementsByClassName']=getElementsByClassName;
})();

上面的代码中我创建了自己的一个JS库“IC”,当然是用的命名空间也是IC。
我在库中定义了2个方法,一个是$一个是getElementsByClass。
$在相当多的框架中被使用。如何保证我们的$不和其他的$冲突,就是使用命名空间。
在实际的使用中,我们使用IC.$('myId');这种方式(命名空间.方法名)的方式避免和其他框架造成冲突。

我们可以看到命名空间其实就是我们自己创建一个2维数组。而这种2维数组就是哈希数组的一种表现形式。可以说我们使用哈里数组实现了JS中命名空间这种特性。


其他的还有很多例子时间关系今天就先写这么多,以后想到了再补充吧。呵呵。。。。
1 楼 hunterdong 2009-12-15  
非常好,勤于思考,写的很有条理,多谢。

看你写的数据仓库笔记,我也正好在看,看到第3章


yourightsite.blogspot.com