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

 

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

 

一:對象編程

    提及對象,咱們不天然就想起了面向對象中自封裝的一個類,一樣JS中也是遵循這個守則,在web編程中幾乎每天用到的就是JSON。是的,數組

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

1     var delivery = {
2         no: 1,
3         sendtime: "2014-11-25",
4         way: "PJS"
5     };

 

從上面能夠看出delivery中只具備基本的字符串和數值類型,固然給你玩的可不只僅就這麼多,除了基本的類型,咱們還能夠定義一個數組類型,spa

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

 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#中的類的感受?可能有人會說,code

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

了而沒有看到本質的東西。blog

  如今對象是建立出來了,下一步就是怎麼用呢?一般有兩種方法:索引

 

<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,你們都能看不到源碼,

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

相關文章
相關標籤/搜索