Javascript之旅——第二站:對象和數組

一覺睡到中午,本來準備起來洗洗繼續睡,不過想想沒轍,還得繼續這個系列,走過變量的第一站,第二站我們再來看看對象和數組。

 

 

 

一:對象

 

    說起對象,我們不自然就想起瞭面向對象中自封裝的一個類,同樣JS中也是遵循這個守則,在web編程中幾乎天天用到的就是JSON。是的,

 

這就是一個對象,不過這個對象下面的字段都是字符串和值類型,如下圖。

 

1     var delivery = {

2         no: 1,

3         sendtime: "2014-11-25",

4         way: "PJS"

5     };

 

 

從上面可以看出delivery中隻具有基本的字符串和數值類型,當然給你玩的可不僅僅就這麼多,除瞭基本的類型,我們還可以定義一個數組類型,

 

函數類型字段,就像下面這樣。

 

復制代碼

 1     var delivery = {

 2         no: 1,

 3         sendtime: "2014-11-25",

 4 

 5         //三個可用配送地址

 6         address: ["北京", "上海", "南京"],

 7 

 8         way: "PJS",

 9 

10         //根據邏輯是否支持配送

11         cansend: function () {

12             //logic code….

13             return true;

14         }

15     };

復制代碼

現在我們的delivery類剎那間就豐富起來瞭,有豐富的可用配送地址,有是否可以配送的邏輯運算,是不是有瞭C#中的類的感覺?可能有人會說,

 

C#中有索引器,有屬性,有事件等等這些,其實這些都是編譯器給的語法糖,真的一點都不好玩,本質上都是些方法,有些人就會被這些糊弄到

 

瞭而沒有看到本質的東西。

 

  現在對象是創建出來瞭,下一步就是怎麼用呢?通常有兩種方法:

 

 

 

<1>  "." 運算符

 

   這種方法,我想是人都應該知道,所以沒什麼好說的,比如:delivery.way。

 

 

 

<2> 索引方式

 

  這種不知道有多少人清楚,就是用字符串索引的方法去尋找,比如我想去找delivery中字符串為“way”的字段值?因為這個“way"字符串

 

可能來自用戶的輸入,那麼這種情況在C#裡面叫做後期綁定,隻能用反射來尋找類的元數據,然後再輸出強類型way的值,但是在JS中肯定

 

是沒有元數據的,不過大概也是用瞭類似反射的方法動態綁定的,說瞭這麼多,我們來看看例子。

 

 

 

 

 

可能有些人想問,JS在內部是不是用哈希做的,我隻能說遺憾的是,不像C#可以反編譯或者看看IL,但是在JS中你是沒法看到底層做瞭些

 

什麼,不過我覺得看似哈希,其實跟C#反射差不多,畢竟key都是string,而value卻是各種類型都有,string,function,int,array等等,

 

有值類型,有引用類型,這些大雜燴都放到value,我覺的不好操作是一點,也不符合設計規范,既然覺得不是hash,在內部在尋找”way“的

 

時候隻能采用遍歷的方式瞭。

 

 

 

 

 

二:數組

 

  說起數組,先要看看數組的定義,兩種方式,字面量和Array構造函數,如下圖:

 

1         var s = [1, "ctrip"];

2         var a = new Array(1, "ctrip");

不過要是你仔細觀察,你也許會發現,字面量能做到的,array構造函數都能做到,字面量做不到的,array也能做到,比如初始化數組的個

 

數。也就是array構造函數的第一個參數。

 

 

 

 

 

因為看不到array中的底層代碼,真是非常的傷心,所以我隻能猜測一下,字面量[] 隻是js提供給我們的語法糖,底層應該還是調用array的

 

第二個重載函數。

 

 

 

 

 

   第二個覺得有意思的地方就是,我們會發現一個現象,數組居然還能和對象扯到一塊,最後會搞得你眼花繚亂,也許這個就是無類型的靈活

 

性,有利有弊吧。

 

  

 

     從圖中我們可以看到,通過s.name="cnblogs"這種類對象賦值的方式,可以將key和value加入到數組中,並且你還可以通過s.name和

 

s["name"]輸出結果值,這就說明數組本質上還是類,隻不過在類裡面做瞭一些高層封裝,比如需要定時的統計length大小,也就造成瞭可

 

以用兩個方式輸出結果值,不過這就造成瞭索引數組和關聯數組並存的情況瞭。如果在C#裡面,普通的索引數組,我們知道他們在堆中的空

 

間具有連續性,這樣就可以使用索引來達到O(1)查找,但是在js中這樣各種類型混在一起,我想應該也沒有辦法做hash查找,因為這樣hash

 

函數真的很難做,讓我寫可能寫不出來,不過同樣很可惜的是,看不到array的源碼,所以沒有發言權瞭。

 

    然後數組方面就沒什麼好說的瞭,什麼for和forin遍歷,數組中常用的操作方法,比如pop,push,join,unshift,shift,大傢都能看不到源碼,

 

也就隻能見名識義的用吧。

發佈留言