找回密码
 快速注册

QQ登录

只需一步,快速开始

查看: 2859|回复: 3

javascript对象、数组和哈希表深入解析

[复制链接]
拉莫斯 发表于 2011-2-28 01:50:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?快速注册

×
javascript中,对象实际上就是一个哈希表,比如下面这个user对象:

function user(n, a)
{
    this.name = n;
    this.age = a;
    this.toString = function() {
        return 'Name:' + this.name + ', Age:' + this.age;
    }
}
var u = new user('tom', 18);
for (var k in u) {
    alert('key: ' + k + ', value:' + u[k]);
}
稍作改动,使用Array对象来代替对象:

var user = new Array();
user['name']='tom';
user['age']=18;
user['toString']=function(){
return 'Name:' + this.name + ', Age:' + this.age;
}
alert(user.toString());
更简单的写法:

var u = {
'name':'tom',
'age':18
}
u.toString = function(){return 'Name:' + this.name + ', Age:' + this.age;};
alert(u.toString());
由以上这些代码可以看出:

所有的javascript对象,包括Array对象在内实际上就是一个哈希表,属性名称就是哈希表的key,而属性的值就是哈希表的值。
Array对象与通常意义的数组对象并不相关,通常的数组仅能通过下标来定位,而javascript中的Array却可以像哈希表一个通过key来定位集合中的对象。
可以将一个function直接作为值赋给对象的“哈希表”。
前端时间看了阮一峰的 《数据类型与Json格式》 一文,提到在yaml描述数据时,将所有的数据分成三种类型:

第一种类型是scalar(标量),一个单独的string或数字,比如“北京”这个单独的词。
第二种类型是sequence(序列),若干个相关的数据按照一定顺序并列在一起,又叫做array(数组)或List(列表),比如“北京,东京”。
第三种类型是map(映射),一个键/值对(Key/value),又称作hash(散列)或dictionary(字典),比如“首都:北京”。
可能这三种类型我们都很熟悉,但文中提到的对json的四条规则却正好剖析了javascript描述数据的方式:

并列的数据之间用逗号(“,”)分隔。
映射用冒号(“:”)表示。
并列数据的集合(数组)用方括号('[]')表示。
映射的集合(对象)用大括号(“{}”)表示。
有了这四条规则(再加上对function的理解),对于很多看上去非常“诡异”的写法,都可以理解了。因此,一个javascript对象,实际上就是一个数组或是映射。
关于数组与映射的不同,可以看下面这个例子:

var m = {
name:'keel',
age:5
}
var a = [m,'sss',3];
//以下请求成功定位到name属性
alert(m['name']);
alert(a[0]['name']);//a[0]定位到m
alert(a[0].name);
//以下失败
alert(m[0]);//映射无法以数组下标的方式访问
从定位到成员的方法来看,映射使用key来定位其中的成员,而数组使用下标,映射无法使用下标定位,同样数组也无法使用key(理所当然,根本就没有key);
从表示方法来看,映射可以使用类似对象属性的方式来访问(如:m.name),也可以使用带key的[]方式(如:m['name'],这是javascript一个特例,看上去像数组,实际上仍是映射);但数组仅能使用下标的方式;
从顺序来看:数组是有顺序的,映射是无序的;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/greymouseyu/archive/2009/07/05/4323135.aspx


 楼主| 拉莫斯 发表于 2011-2-28 01:51:19 | 显示全部楼层
 数组下标
  javascript 中的数组是稀疏的。也就是说,如果一个数组具有三个元素,编号分别为 0、1 和 2,您就可以创建元素 50,而不必担心从 3 到 49 的参数。如果该数组有一个自动的 length 变量,该 length 变量被设为 51,而不是 4。当然您可以创建各元素的编号之间没有间隙的数组,不过没有必要这样做。实际上在 javascript 中,数组根本没有编号的下标。
  在 javascript 中,对象和数组实质上是一样的。真正的差异不在于数据,而在于您引用数组的成员或对象的属性 和 方法的方式。
  数组寻址
  有两种方式来引用数组中的成员。一般说来,可以使用方括号来引用数组。方括号中是一个数字或一个值为非负整数的表达式 。下面的示例假定在脚本的其他地方已定义了entrynum 变量,且已赋值。
thelisting = addressbook[entrynum];
thefirstline = thelisting[1];
  这种寻址方法与对象寻址的方法是等价的,不过在对象寻址中在圆点后必须使用实际的属性名。如果没有这样的属性,代码将产生一个错误。
  数组寻址的第二种方式是制作一个包含编号属性的对象/数组,然后用一个循环产生这些编号。下面的示例将产生两个数组:一个代表名字,一个代表地址,名字和地址均来自 addressbook 中的一个列表。每一项包含四个属性。例如,从thelisting的 [name1] 到 [name4] 属性产生的thename实例可能包含 "g." "edward" "heatherington" "iv", 或 "george" "" "sand" ""。
thelisting = addressbook[entrynum];
for (i = 1; i < 4; i++) {
thename[i] = thelisting["name" + i];
theaddress[i] = thelisting["address" + i];
}
  虽然这个特定的实例很短,并且可以很容易地使用 "."这种记法来表示(也就是按地址而不是按数组来对 thelisting、thename和 theaddress 寻址),但这并不总是可行的。有时特定的属性可能要在运行时才会存在,或者预先并不知道将是哪些项。例如,如果addressbook 数组不是编好号码的清单,而是按姓排列的,用户可能在正在运行该脚本时“随意”输入名称来查找人员。下面的实例假定在脚本的其他地方已提供了适当的函数定义。
thelisting = addressbook[getname()];
theindivlisting = thelisting[getfirstname()];
  这是数组的关联寻址,也就是说,依靠完全任意的字符串来寻址。javascript 中的对象实际上就是关联数组。尽管可以(并且是频繁地〕使用 "."这种圆点寻址风格,但无论如何不是必需的。因为 javascript 对象的任何属性都可以使用数组标记法来寻址,因此 javascript 对象可以作为一个关联数组使用。
  下面的代码创建并初始化数组的最常见格式:
  var myarray = new array("athens", "belgrade", "cairo");
  该数组的每个元素都是使用其元素编号来寻址的;在本例中是 0、1 或 2。使用 for...in 语句,该数组可以从 0 开始到 2 结束来进行遍历。例如:

for (key in myarray)
response.write("element value is " + myarray[key] + "<br>);
  下面的代码创建并初始化一个包含三个元素的关联数组:
  var myarray = {"a" : "athens", "b" : "belgrade", "c" : "cairo" };
  在该数组中,可以使用字符串("a"、 "b" 或 "c") 来对元素寻址,而不是用数组元素的编号 (0、1 或 2)寻址。这样就可以以更直观的寻址方案来创建和使用数组。同样可以使用上面显示的 for...in 语句代码来遍历该数组。
回复

使用道具 举报

 楼主| 拉莫斯 发表于 2011-2-28 01:52:16 | 显示全部楼层
今天看key有点看不懂,困了,明天再研究;
我想以后这种东西就发我的空间吧
回复

使用道具 举报

 楼主| 拉莫斯 发表于 2011-3-1 01:10:43 | 显示全部楼层
今天重新看了下,有了新的理解“javascript中的Array却可以像哈希表一个通过key来定位集合中的对象。
可以将一个function直接作为值赋给对象的“哈希表””。

for(var key in对象或者数组)用来 遍历一个对象的所有属性或者是一个数组的所有元素;
数组作为容器,仍然是使用key value的方式从存取信息。这不就是一个map吗?再使用key方式访问容器也就合情合理;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表