一覺睡到中午,原本準備起來洗洗繼續睡,不過想一想沒轍,還得繼續這個系列,走過變量的第一站,第二站咱們再來看看對象和數組。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,你們都能看不到源碼,
也就只能見名識義的用吧。