在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一個特例,看起來像數組,實際上仍是映射);但數組僅能使用下標的方式;
從順序來看:數組是有順序的,映射是無序的;