轉載出處:
鏈接: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;
就是一個表達式語句。