javascript中括弧的幾種含義

來源:互聯網
上載者:User

標籤:

小括弧
       JavaScript中小括弧有五種語義
       語義1,函式宣告時參數表
              function func(arg1,arg2){  
              // ...
              }  
       語義2,和一些語句聯合使用以達到某些限定作用
              // 和for in一起使用
                      for(var a in obj){  
              // ...
              }  
              // 和if一起使用
                      if(boo){  
              //...
              }  
              // 和while一起使用
              while(boo){  
              // ...
              }  
              // 和do while一起使用 do{  
              // ...
              }
              while(boo)  
              注意:在與if、while及do while一起使用時小括弧會將其中的運算式結果隱式的轉換成布爾值。見無處不在的隱式類型轉換 。
       語義3,和new一起使用用來傳值(實參)
              // 假設已經定義了類Person,它有兩個欄位姓名(name),年齡(age)      
              var p1 = new Person(‘Jack‘,26);  
       語義4,作為函數或對象方法的調用運算子(如果定義了參數也可與語義3一樣傳實參)
              // 假設已經定義了函數func     
               func();  
              // 假設已經定義了對象obj,且擁有func方法
              obj.func();  
              這裡提下typeof運算子,有人喜歡這麼使用
              請注意typeof後的小括弧並非語義4(即不是函數調用),而是後面提到的語義5。我使用typeof一般不加後面的小括弧。見 具名函數的多種調用方式
       語義5,強製表達式運算
              function strToJson(str){                  // eval 中字串兩旁加了強制運算子()
              var json = eval(‘(‘ + str + ‘)‘);       
              return json;  
              }  
              關於語義5,大家最熟悉的莫過於使用eval解析JSON
              又如使用較多的是匿名函數自執行          
              (function(){  
              // ...
              })();  
              注意,以上代碼第1對小括弧是語義5,第3對則是語義4。

大括弧
       JavaScript中大括弧有四種語義作用

       語義1,組織複合陳述式,這是最常見的

              if( condition ) {  
              //... 
              }else {  
              //... 
              }  for() {  
              //... 
              }  

       語義2,對象直接量聲明

              var obj = {      name : ‘jack‘,      age : 23  };  

       整個是個指派陳述式,其中的{name:‘jack‘,age:23}是個運算式。

       語義3,聲明函數或函數直接量

              function f1(){  
              //... 
              }  
              var f2 = function(){  
              //... 
              }  

        f1與非f2的區別是前者在文法解釋期,後者在運行期。區別在於:如果調用該函數的代碼在函數定義之後,則沒有區別;如果調用該函數的代碼在函數定義之前,則f1仍然可以調用,f2則會報錯,提示f2未定義。

       語義4,結構化異常處理的文法符號
              try {  
              //... 
              }catch( ex ){  
              //... 
              }finally{  
              //... 
              }  

       這裡的大括弧與符合語句(語義1 )是有區別的,大括弧中如果只有一條語句,在if/else/for等中大括弧是可以省略的,但try/catch/finally則不能省略。

以下代碼糾結了偶N久

              function(){}() //匿名函數立即執行, 文法分析期報 
              {}.constructor //擷取對象直接量的構造器,文法分析期報錯


       令人不解的是為何[].constructor這麼寫卻不報錯呢,一個是想擷取對象直接量的構造器,一個是擷取數組直接量的構造器而已。

       當然添加個變數接收也不會報錯

       同樣的情況如

              var fn = function(){}(),也不會報錯。

       實際上是js的“語句優先”在作怪,即{}被理解成複合陳述式塊(語義1 )而不是對象直接量(語義2 )或聲明函數(語義3 )的語義。

function(){}(),大括弧被理解成複合陳述式,自然前面的function()聲明函數的文法不完整導致文法分析期出錯。

       {}.constructor,大括弧被理解成複合陳述式,大括弧後面是點運算子,點運算子前沒有合理的對象自然也報錯。

       修複方式眾所周知:加個強制運算子()

       (function(){})(),(function(){});//強制其理解為函數(語義3 ),“函數()”表示執行該函數,即聲明後立即執行了。

       ({}).constructor //({})強制把大括弧理解成對象直接量(語義2 ),“對象.xx”表示擷取對象的成員,自然後面的點運算子可以正常執行了。


中括弧
       JavaScript中括弧有四種語義

       語義1,聲明數組

              var ary = []; // 聲明一個空數組
              var ary = [1,3]; // 聲明一個數組,同時賦初值


       語義2,取數群組成員

              var ary = [1,2,3];  var item = ary[0];  

       語義3,定義對象成員 (可以不遵循標識符規則 )

              var obj = {};  
              // 為obj添加一個屬性name,name是合法的標識符,即也可以通過obj.name方式來定義
              obj[‘name‘] = ‘jack‘;   
              // 為obj添加一個屬性2a,2a不是合法的標識符(不能以數字開頭),不能通過obj.2a來定義
              obj[‘2a‘] = ‘test‘;   

       語義4,取對象成員

              var obj = {name:‘jack‘};  obj[‘2a‘] = ‘test‘;  
              obj[‘name‘]; // --> jack
              obj[‘2a‘]; // --> test (不能通過obj.2a擷取)

javascript中括弧的幾種含義

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.