刚参加完微软的OpenMS比赛,恩,比较幸运拿了个最佳作品奖。在这里把作品贴一下,大家可以去看看http://xlucien.net/onlineDJ    

嗯,下来说正题,最近和朋友讨论到了这个问题,然后研究了一下。

在js里面, 数组是一种特殊的对象,这个大家都知道,typeof数组的时候出来的是object,这和其他的number、string等对象不同,以前一直以为这是js设计的一个失误,现在发现并不止是这样。

在js里,所有类型都是基于对象生成的,这点毋庸置疑,而对象实际上是基于哈希表建立的。

对于这个问题,看了阮一峰大神的理解后,总结一下,这里的哈希表,其实就是一种叫做YAML的建议数据交换格式,文档在这里   ,例如如下格式



var p = {
    ‘name’:'value'
}



这里的‘name’叫做序列(sequence),‘value’叫做标量(scalar),他们之间的冒号关系叫做映射(mapping)或散列(hash)或字典(dictionary)。

 

其实json就是这样的一个标准形式。

大概规定是这样的:并列的数据用逗号“,”分隔 ,映射用冒号“:”表示,并列数据(数组)用方括号“[]”表示,映射的集合(对象)用大括号(“{}”)表示。

再看json的用法,例如上面那个例子,因为json是个对象,可以用p.name来访问value,但是由于json又是特殊的对象,可以用数组的形式p.[''name]来访问。

再看数组,有一个奇怪的现象

 


var a = [0,1,2,3];
a.['foo'] = 'hehe';
console.log(a)


运行这段代码,打印出a依然是[0,1,2,3],取a.length结果为4,但是打印a['foo']却也能得到‘hehe’,那么a['foo']去了哪里呢?

 

其实js里面,数组是一种特殊的有序的可以没有名字的对象,而对象用其他语言的描述来说,其实一种关联数组,有名字,无序的数组,但是js里面没有关联数组只说,数组是对象,对象包括数组。

那么a['foo']去了哪里呢? 既然数组是对象,那么在使用数组时,就是经过了处理的对象,像number一样,输出的时候只输出number,但是它确实是通过new Numbwe()得到的。

那么相同的道理,数组在输出的时候也是经过了处理的,把a[foo'] 这个东西不输出了,但是a又是一个对象,所以会像对象一样有一个a['foo']的值,只不过a被声明做了数组,所以直接使用a 的时候就只有[0,1,2,3]了。

 

这样讲,大家不知道清楚不,虽然还是有点混乱。

捋一捋,在js里,其实数组和对象是上下级关系,数组是特殊的对象,他可以像对象一样使用,又必须满足数组自身的约束,在不违背自身约束的情况下,它可以被当做对象使用。而json,也是一种对象,和数组一样拥有特殊约束的对象。