1. 程式人生 > >JS中表達式的理解

JS中表達式的理解

作者:鄭航
連結:http://www.zhihu.com/question/39420977/answer/81250170
來源:知乎
著作權歸作者所有,轉載請聯絡作者獲得授權。

表示式:是由運算元和運算子(可選)構成,併產生運算結果的語法結構。

以下在ES5中被稱為基本表示式(Primary Expression)
  • this、null、arguments等內建的關鍵字
  • 變數。即一個已宣告的識別符號
  • 字面量。僅包括數字字面量、布林值字面量、字串字面量、正則字面量
  • 分組表示式,即用來表示立刻進行計算的
這類表示式是原子表示式,是無法再分解的表示式。

除基本表示式以外,還有如下表達式,稱為複雜表示式,這類表示式需要其它表示式參與
  • 物件的初始化表示式、陣列的初始化表示式:分明也是字面量的一種,但不把它們算作基本表示式,是因為物件字面量、陣列字面量所包含的成員也都是表示式。陣列初始化表示式語法如下:
    [expression,expression,expression]
    
    可以有0個及其以上個子表示式
    
    物件的初始化表示式如下:
    {
      expression1: expression2,
      expression1: expression2,
      expression1: expression2
    }
    在ES5及其之前,expression1只能是字串字面量;
    
    ES6開始支援如下語法:
    
    {
      [expression1]: expression,
      [expression1]: expression,
      [expression1]: expression
    }
    
    expression1可以是任何返回值為字串或Symbol型別的表示式
    

  • 函式定義表示式(注意,需與函式宣告語句區分開)
  • 屬性訪問表示式:之前一直以為跟在物件後面的句點或者方括號是運算子,實際上不是,它們是屬性訪問表示式的語法結構的一部分。屬性訪問表示式語法如下:
    expression.identifier
    
    其中,expression可以是任意的表示式,identifier是屬性名(必須合法)
    
    或者
    expression1[expression2]
    
    其中,兩個expression可以是任意的表示式
    expression2的值會被轉化為字串(除非它是一個Symbol型別)
    
  • 呼叫表示式: 分為“方法呼叫”與“函式呼叫”。方法呼叫的語法是:
    expression0([[expression1[,expression2[,expression3]]])
    
    其中,expression是一個返回值為函式物件的屬性訪問表示式,小括號提供一個逗號分隔的引數列表。
    
函式呼叫的語法是:
expression0([expression1[,expression2[,expression3]]])

其中,expression0是一個返回值為函式物件的表示式,
小括號提供一個逗號分隔的引數列表
可見,小括號並非一個操作符,而是呼叫表示式的語法的一部分
  • 物件建立表示式:語法如下:
    new expression0([expression1[,expression2[,expression3]]])
    
    其中,expression0是一個返回值為函式物件的表示式,
    小括號提供一個逗號分隔的引數列表(整個小括號內部的引數列表是可以省略的)
    
    可見,小括號並非一個操作符,而是呼叫表示式的語法的一部分

----------------

以上所有表示式,由於未使用運算子,稱為單值表示式。除此之外的叫做複合表示式

JavaScript表示式總有返回值,其中,單值表示式的結果是值本身,其他表示式結果是根據運算子進行運算的結果值。


由於每個表示式都有返回值,因此每個表示式都能作為“鄰近”的表示式的運算元參與運算。可以將無限個表示式“鄰近”地連線成複合表示式


總結:分類如下

  • 單值表示式:不使用運算子的表示式
    • 簡單表示式:不能再分解的表示式
    • 複雜表示式:需要其它表示式參與的表示式

  • 複合表示式:由運算子將多個單值表示式結合而成的表示式


所有表示式均有返回值

===============================

語句:JavaScript程式碼由語句構成,表明了執行過程的流程、限定和約定,形式上可以是單行語句,也可以是由大括號括起來的複合語句。語句由分號來分隔。語句是“使某事發生”的指令,不存在返回值一說


當語句位於以下地點之一時,可以省略分號(不會出現語法錯誤,但可能造成執行階段的錯誤):

  • 一行的最後
  • 整個程式碼檔案的最後
  • 在語法分隔符之前(如複合語句的大括號“}”)
  • 複合語句的大括號“}”之後

其它情況下遺漏分號,會在語法分析過程中報錯,全部程式碼完全不執行。


語句中比較特殊的一類是表示式語句,表示“只有表示式,沒有其它語法元素的語句”,例如:

1+2+3;

就是一個表示式語句。