深入瞭解JavaScript

來源:互聯網
上載者:User

在我們的項目中,尤其是我們的web項目,無論你是用何種語言編寫,java、C#.....JavaScript這種前台頁面的指令碼語言都占居著舉足輕重的地位,下面帶大家深入走進JavaScript,探索其中的奧秘,一起學習,共同進步!!
    1、 要深入理解JavaScript,你得首先放下對象和類的概念,回到資料和代碼的本原。前面說過,編程世界只有資料和代碼兩種基本元素,而這兩種元素又有著糾纏不清的關係。JavaScript就是把資料和代碼都簡化到最原始的程度。
     2、 JavaScript中的資料很簡潔的。簡單資料只有 undefined, null, boolean, number和string這五種,而複雜資料只有一種,即object。JavaScript中的代碼只體現為一種形式,就是function。   注意:以上單詞都是小寫,不要和Number, String, Object, Function等JavaScript內建函數混淆了。要知道,JavaScript語言是區分大小寫呀!
      3、任何一個JavaScript的標識、常量、變數和參數都只是unfined, null, bool, number, string, object 和 function類型中的一種,也就typeof傳回值表明的類型。除此之外沒有其他類型了。
      eg:var a=123,typeof(a)---->number;var b="123",typeof(b)----->string;var c=null,typeof(c)---->object;var d=true
              typeof(d)--->bool;var e=undefined,typeof(e)---->undefined;var f=function(){alert(1)}; typeof(f)----->function
       4、JavaScript中沒有類的概念,只有函數,並且函數統一由function定義,JavaScript函數就是對象的本質。函數的定義方式:
  <script type="text/javascript">
     //常用的定義方式
     function test(){
     alert("hello");
  }
 //變數式定義 
  var test=function(){
     alert("world");
  }
  </script>
      事實證明:JavaScript中的函數也是一種變數。
       5、JavaScript執行引擎並非一行一行地分析和執行程式,而是一段一段地分析執行的。而且,在同一段程式的分析執行中,定義式的函數語句會被提取出來優先執行。函數定義執行完之後,才會按順序執行其他語句代碼。
  <script type="text/javascript">
     function test(){
    alert(1);
  }
  test();
  function test(){
    alert(2);
  }
  test(); 
  </script>
上面這段代碼中,返回的值都是2,而沒有1的輸出,正是因為它是一段一段執行的。
        6、   任何一個函數都可以為其動態地添加或去除屬性,這些屬性可以是簡單類型,可以是對象,也可以是其他函數。
  <script type="text/javascript">
     function test(){
    with(arguments.callee){//遍曆屬性元素
       alert(attr1+":"+attr2);
    }
  }
  test.attr1="測試屬性1";
  test.attr2="測試屬性2";
  test();
  </script>
       7、JavaScript中,對象和函數可以象數組一樣,用屬性名稱或方法名作為下標來訪問並處理。

       
     JavaScript裡的函數和對象既有對象的特徵也有數組的特徵。這裡的數組被稱為“字典”,一種可以任意伸縮的名稱值對兒的集合。其實, object和function的內部實現就是一個字典結構,但這種字典結構卻通過嚴謹而精巧的文法表現出了豐富的外觀。正如量子力學在一些地方用粒子來解釋和處理問題,而在另一些地方卻用波來解釋和處理問題。你也可以在需要的時候,自由選擇用對象還是數組來解釋和處理問題。只要善於把握 JavaScript的這些奇妙特性,就可以編寫出很多簡潔而強大的代碼來。
        8、JavaScript中也有this,但這個this卻與C++、C#或Java等語言的this不同。一般程式設計語言的this就是對象自己,而 JavaScript的this卻並不一定。

    從上面的代碼可以看出,同一個函數可以從不同的角度來調用,this並不一定是函數本身所屬的對象。this只是在任意對象和function元素結合時的一個概念,是種結合比起一般對象語言的預設結合更加靈活,顯得更加超然和洒脫。
       9、JavaScript中對象的建立
       1)通過json形式建立:
  <script type="text/javascript">
     var person={};//建立一個沒有任何屬性和方法的對象
  var person={name:"jack",age:25,married:false};//建立包含屬性的對象
  var person={name:"jack",age:25,say:function(alert("hello"))};//建立包含屬性和方法的對象
  //建立一個嵌套對象和對象數組的對象
  var person={
                name:"jack",
       birthday:{year:1965,month:6,day:23},
       friends:[{name:"mary",age:21},{name:"jhon",age:22}]
             };
  </script> www.2cto.com
JSON就是JavaScript對象最好的序列化形式,它比XML更簡潔也更省空間。對象可以作為一個JSON形式的字串,在網路間自由傳遞和交換資訊。而當需要將這個JSON字串變成一個JavaScript對象時,只需要使用eval函數這個強大的數位轉換引擎,就立即能得到一個 JavaScript記憶體對象。正是由於JSON的這種簡單樸素的天生麗質,才使得她在AJAX舞台上成為璀璨奪目的明星。
      2)通過new關鍵字構造建立對象:
        function test(){alert("hello");}  var obj=new test();//使用new操作符,藉助MyFun函數,就建立了一個對象。
        等價於 function test(){};   var obj={};//建立一個空的對象 test.call(obj);//將obj對象作為this指標調用test函數
  理解:JavaScript先用new操作符建立了一個對象,緊接著就將這個對象作為this參數調用了後面的函數。其實,JavaScript內部就是這麼做的,而且任何函數都可以被這樣調用!但從 “anObj = new MyFunc()” 這種形式,我們又看到一個熟悉的身影,C++和C#不就是這樣建立對象的嗎?原來,條條大路通靈山,殊途同歸啊!
       我們還可以用js建立建構函式
  <script type="text/javascript">
     function say(){//先定義一份say函數代碼
    alert("hello world:"+this.name);
  }

     function person(name){//帶參數的建構函式
    this.name=name;//將參數值賦給給this對象的屬性
    this.say=say;//給this對象say方法賦值為前面那份say代碼
  }

  var jack=new person("jack");//建立jack對象
  jack.say();//輸出:hello world:jack
  var mary=new person("mary");//建立mary對象
  mary.say();//輸出:hello world:mary
  alert(jack.say==mary.say);//輸出true
       alert(jack.say()==mary.say());//輸出true
  alert(jack.constructor==person);//輸出true
  </script>
函數不但可以當作建構函式,而且還可以帶參數,還可以為對象新增成員和方法。
jack.say()==mary.say());輸出結果表明兩個對象確實共用了一個函數對象,這段程式達到了共用了一份方法代碼的目的,但卻不怎麼優雅。因為,定義 say方法時反映不出其與person類的關係。JavaScript早想到了這一問題,她的設計者們為此提供了一個有趣的prototype概念。
        10、js中的delete表示刪除一個對象    
       我們可以這樣刪除一個屬性:    var obj={attr:1};  delete obj.attr;  alert(obj.attr);輸出undefined
      但是不能這樣刪除:var obj=1;    delete obj; alert(obj);輸出1
     也不能這樣刪除:    var obj={say:function(){alert("test")}};  obj.say();  delete obj.say(); obj.say();//報錯
     當一個屬性不能被刪除時,delete只返回false。為什麼呢?自己查查哦!
      11、閉包函數傳參,靈活運用
  <script type="text/javascript">
     function test(a){
     alert(a);
  (function(b){
     alert(b);
  })(3);
  }
  test(1);
  </script>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.