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

  1. function user(n, a)
  2. {
  3. this.name = n;
  4. this.age = a;
  5. this.toString = function() {
  6. return "Name:" + this.name + ", Age:" + this.age;
  7. }
  8. }
  9. var u = new user("tom", 18);
  10. for (var k in u) {
  11. alert('key: ' + k + ', value:' + u[k]);
  12. }

稍作改动,使用Array对象来代替对象:

  1. var user = new Array();
  2. user["name"]="tom";
  3. user["age"]=18;
  4. user["toString"]=function(){
  5. return "Name:" + this.name + ", Age:" + this.age;
  6. }
  7. alert(user.toString());

更简单的写法:

  1. var u = {
  2. "name":"tom",
  3. "age":18
  4. }
  5. u.toString = function(){return 'Name:' + this.name + ', Age:' + this.age;};
  6. 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对象,实际上就是一个数组或是映射。
关于数组与映射的不同,可以看下面这个例子:

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

js 数组(哈希数组,又名关联数组)

哈希(hash)数组(关联数组): ==> 哈希数组内元素无序,普通数组的数组长度length对哈希数组无效
实例:[ name: ‘小明’, id:’openDoor’ ] // 以[键名:键值]即[key:value] 键值对的形式出现
声明数组:var hash = [ name: ‘小茗同学’, id: ‘4405*680’, sex:’男’ ];哈希数组的存储内容以一对对键值对的形式出现
向数组中添加一个元素 hash[‘name’] = ‘小茗同学’; // 键名 name,键值 小茗同学;
等价于 hash.id= ‘4405*
680’; // 键名: id,键值: 4405*680;
修改关联数组元素值:hash.sex = ‘男;
动态键名:var n = ‘id’; hash[n] = 12; // 键名随n的改变而变,键值 12;
遍历关联数组 for in **: for (var key in hash) { } // for (var 键名变量 in 关联数组) {}