Oo緣來是你oO


          posts - 120,comments - 125,trackbacks - 0

                     如何讓你的程序運行的更快 (2)--- JavaScript中的數組字符串下標的運用
                                                            
                                                                 
          馬嘉楠 2006-11-09


          序:

          好久沒有寫這個系列的文章了,不知道還有沒有人等我的下文。哈哈,臭美一個。

          在學習的過程中,好幾次都準備寫了,可是每次動筆的時候總會想,這個東西寫出來有意義么?如果是人所共知唯獨我不知道的,就算寫出來對大家也沒什么幫助,只能算是我的學習筆記罷了,放在這個下面顯然不合適。

          厚積薄發,希望每一篇文章都能對大家有所幫助(真希望每一篇都是精品,可惜水平有限啊),由于我也是初學者,文中的東西可能比較適合新手,如果有錯誤,請告知,謝謝。

          如何讓你的程序運行的更快(1) 中,講了Java 中的 String StringBuffer,這里又跳到 JavaScript Array,呵呵,學到哪,就寫到哪吧。



          正文:

          今天在看到 JavaScript 中 Array 這一部分的時候,發現字符串也可以作為數組的下標,以前還真不知道,孤陋寡聞。。。。
          既然提供了這個特性,那么就有它的存在價值,我們來看看有什么用,歡迎大家補充。

          首先,Array 是從 Object 繼承下來,所以 Array 具有 Object 有的任何能力。看看Object作為集合的情況:

          新建: var  object  =   new  Object(); 或  var  object  =  {};
          增加: object[strIndex ] 
          =
           value; (strIndex 為string)
          刪除:
          delete
           object[strIndex ];
          遍歷:
          for  (  var  strObjIndex  in  object ) object[strObjIndex ]; 

          code 1:

          var  object  =  {};    // var object = new Object(); 二者等價
          object[ " First " =   " Firstmm " ;
          object[
          " Second " =   " Secondmm "
          ;
          object[
          " Third " =   " Thirdmm "
          ;
          delete  object[ " Second "
          ]; 

          for  (  var strObjIndex in
          object )
              alert(
          " strObjIndex = " + strObjIndex + "\nobject[" +strObjIndex + "] = "+
          object[strObjIndex]); 


          除了我們熟悉的方法外,Array也是可以用字符串做下標,像code 1 中的 Object 一樣。

          code 2:

          var  array  =   new  Array();    // var array = []; 二者等價
          array[ " First " =   " Firstgg " ;
          array[
          " Second " =   " Secondgg "
          ;
          array[
          " Third " =   " Thirdgg "

          delete  array[ " First "
          ]; 

          for  (  var  strArrayIndex  in
           array )
              alert(
          " strArrayIndex =  " + strArrayIndex + "\narray[" +strArrayIndex + "] = " + array[strArrayIndex]); 


          在某些情況下,用字符串做下標可以提高我們的訪問效率,
          例如我們要在Array中檢索出一個指定的值,通常做法,我們需要遍歷整個數組,如下:

          code 3:

          var  arrayTest  =   new  Array();    // var arrayTest = []; 二者等價
          //
          初始化arrayTest
          arrayTest.push( " Blog " );           // arrayTest[0] = "Blog"; 二者等價
          arrayTest.push( " Java " );
          arrayTest.push(
          " MaJianan "
          );

          var  output  =   "" ;    // 用于輸出


          // 我們需要檢索出值為 Majianan 的元素,通常做法如下:
          for ( var  i = 0 ; i < arrayTest.length;i ++ ){
              if (arrayTest[i] == " MaJianan "
          ){
                  output 
          =   " 用整數做下標的Array:哈哈! ^+^ \n "
          ;
                  output 
          =  output  +   " "   +  i  +   " 次才找到\n "
          ;
                  output 
          =  output  +   " arrayTest[ "   +  i  +   " ] =  "   +
           arrayTest[i];
                  alert(output);
              }
          else
          {
                  output 
          =   " 用整數做下標的Array:555555555 \n "
          ;
                  output 
          =  output  +   " "   +  i  +   " 次沒有找到\n "
          ;
                  output 
          =  output  +   " 找到的是arrayTest[ "   +  i  +   " ] =  "   +
           arrayTest[i]
                  alert(output);
              }
          }


          code 4:

          // 使用字符串做數組下標
          var  arrayTest1  =  [];
          arrayTest1[
          " blog " =   " Blog "
          ;
          arrayTest1[
          " java " =   " Java "
          ;
          arrayTest1[
          " majianan " =   " MaJianan "


          var  key = " majianan "


          if ( typeof (arrayTest1[key]) == " undefined "
          ){
              output 
          =   " 用字符串做下標的Array:555555555 \n "
          ;
              output 
          =  output  +   " 沒找到下標為 "   +  key  +   " 的東東。\n "
          ;
              output 
          =  output  +   " 明明沒有這個東西,還讓我找,耍我呢吧!!! "
          ;
              alert(output);
              // do sth

          } else {
              output 
          =   " 用字符串做下標的Array:哈哈! ^+^ 一次搞定\n "
          ;
              output 
          =  output  +   " 找到arrayTest1[ "   +  key  +   " ] =  "   +
           arrayTest1[key];
              alert(output);
              // do sth



          var  key1 = " hello "


          if ( typeof (array[key1]) == " undefined "
          ){
              output 
          =   " 用字符串做下標的Array:555555555 \n "
          ;
              output 
          =  output  +   " 沒找到下標為 "   +  key1  +   " 的東東。\n "
          ;
              output 
          =  output  +   " 明明沒有這個東西,還讓我找,耍我呢吧!!! "
          ;
              alert(output);
              // do sth

          } else {
              output 
          =   " 用字符串做下標的Array:哈哈! ^+^ 一次搞定\n "
          ;
              output 
          =  output  +   " 找到arrayTest1[ "   +  key1  +   " ] =  "   +
           arrayTest1[key1];
              alert(output);
              // do sth



          Array的這個特性(用字符串做下標)可以用來高效的檢索Unique的字符串集合。
          遍歷用整數做下標的Array的時間復雜度是O(n),而遍歷用字符串做下標的Array的時間復雜度是O(1)。



          所有代碼:

           



          馬嘉楠
          jianan.ma@gmail.com

          posted on 2006-11-09 16:44 馬嘉楠 閱讀(5208) 評論(4)  編輯  收藏 所屬分類: Java Script

          FeedBack:
          # re: 如何讓你的程序運行的更快 (2)--- JavaScript中的數組之字符串下標的運用
          2007-09-12 02:09 | 李曉曉
          雖然我一個沒有看懂,不過你真的好強哦。= =  回復  更多評論
            
          # re: 如何讓你的程序運行的更快 (2)--- JavaScript中的數組之字符串下標的運用 [未登錄]
          2008-08-12 11:16 | James
          寫的不錯哦,很有保存價值,
          今天又學了點小知識,哈哈  回復  更多評論
            
          # re: 如何讓你的程序運行的更快 (2)--- JavaScript中的數組之字符串下標的運用
          2011-07-15 18:14 | Tingo
          "遍歷用整數做下標的Array的時間復雜度是O(n),而遍歷用字符串做下標的Array的時間復雜度是O(1)。"

          這一段是不足以作為效率參考依據的,你沒有考慮Java腳本引擎在底層處理這兩種代碼的不同方式。
          以字符串作為下標給數組添加項目的時候,實際上是創建了一個特別的無序數組項,它本身沒有公有的自動給予的數字下標,(實際上數組內部的私有數據里仍有對這個項目的唯一下標,)而值是一個特殊對象,它有一個標簽屬性為你指定的字符串下標,另外還有一個屬性用來存放你給這個項目指定的值。在用字符串下標進行數組項獲取的時候,數組內部仍然要遍歷所有項目來檢索該項目,和數字下標沒有任何差別。另外,因為需要額外的空間來儲存標簽信息,用字符串下標儲存的項目要比數字下標占用更多內存,在效率上反而低下。java腳本之所以提供這種功能,主要是為了方便編寫,但這種“偷懶”的方式本身是算不上高效的。希望提高代碼執行效率的還是應該從編譯原理本身去優化代碼結構。  回復  更多評論
            
          # re: 如何讓你的程序運行的更快 (2)--- JavaScript中的數組之字符串下標的運用 [未登錄]
          2013-05-13 11:10 | xxx
          這個不能稱之為下標吧 而是為對象添加屬性,,  回復  更多評論
            
          主站蜘蛛池模板: 准格尔旗| 鹿邑县| 枣阳市| 安塞县| 苍梧县| 靖江市| 平昌县| 肇东市| 临海市| 北流市| 汤阴县| 嘉禾县| 团风县| 景德镇市| 格尔木市| 堆龙德庆县| 湘阴县| 高唐县| 巴林左旗| 子长县| 天长市| 长兴县| 关岭| 章丘市| 富源县| 明光市| 城口县| 法库县| 东莞市| 武川县| 衢州市| 遵义县| 井陉县| 宝山区| 贵溪市| 巫溪县| 宜章县| 枞阳县| 武陟县| 龙岩市| 石台县|