表達式是javascript中的一個短語,javascript解釋器會將其計算出一個結果。程序中常用量是最簡單的一類表達式就是變量。變量名也是一種簡單的表達式,它的值就是賦值給變量的值。
復雜的表達式是由簡單的表達式組成的。比如數組訪問表達式是由一個表示數組的表達式,方括號、一個整數表達式構成。它們所組成新的表達式運算結果是該數組特定位置的元素值。同樣的函
數調用表達式由一個表示函數對象的表達式和0個多個參數表達式構成。將簡單表達式組成復雜表達式最常用的方法就是運算符。
本章(本文)將講解所有javascript運算符。同時也講解不涉及運算符的表達式(比如訪問數組元素和函數調用),其語法和編程風格和c語言都很相似。
1.元素表達式
最簡單的表達式是“原始表達式”,原始表達式是表達式的最小的單位--它們不包含其他表達式。javascript中的原始表達式包含常量或直接量。關鍵字和變量。
直接量是直接在程序中出現的常數值。它們看起來像:
代碼如下:
javascript中的一些保留字構成了原始表達式
代碼如下:
通過第三章的學習,和其它關鍵字不同,this並不是一個常量,他在程序的不同地方返回的值也不相同。this關鍵字經常在面向對象編程中出現。this返回方格方法的對象。
最後,第三種原始表達式是變量
代碼如下:
2.對象和數組的初始化表達式。
對象和數組初始化實際上是新創建的對象和數組,這些初始化的表達式有時候叫做“對象直接量”和“數組直接量”。然而和布爾直接量不同,他們不是原始表達式,因為他們所包含的成員或者元素都子表達式。
數組的初始化表達式語法非常簡單,我們以下開始
數組的初始化表達式是通過一對方括號和其內由逗號隔開的列表構成的,初始化結果是一個新創建的數組。數組的元素是逗號分隔表達式的值。
[] //一個空數組;[]內留空即表示該數組沒有任何元素
[1+2,3+4] //有兩個元素的數組,第一個3,第二個是7
數組初始化表達式中的元素初始化表達式可以是數組初始化表達式。也就是說表達式是可以嵌套的
代碼如下:
數組直接量中列表之間的元素可以省略,空位就會填充undefined.例如下面:
代碼如下:
其中4個元素是undefined.數組直接量的結尾處留下逗號,這時不會創建一個新的值為undefined的元素。
對象初始化表達式和數組初始化表達式非常相似,只是方括號被花括號代替。並每個字表達式包含一個屬性名和非冒號作為前綴。
代碼如下:
對象直接量也可以嵌套,比如
代碼如下:
javascript在計算對象初始化表達式的值時候,對象表達式都會各自計算一次,並且他們不必包含常數值:它們可以是任意javascript表達式。同樣,對象直接量中屬性的名稱可以是字符串而不是標識符。(在在那行只能使用保留字或一些非法標識符作為屬性名的時候非常有用)
代碼如下:
第6 7章還會再次討論對象和數組的初始化表達式。
3.函數表達式
函數定義表達式定義一個javascript函數。表達式的值是這個新定義的函數。從某種意義上將,函數定義表達式可以成為函數直接量,函數表達式可稱為“函數直接量”,畢竟對象初始化表達式也稱為“對象直接量”。一個典型的函數定義表達式包含關鍵字function,其後是一對圓括號,括號以內是逗號分隔的列表,列表包含0或多個標識符(參數名)。然後跟隨花括號包裹的javascript代碼段(函數體).
var square = function(x){ return x*x};
函數定義表達式同樣可以包含函數的名字。函數也可以通過函數語句來定義,而不是函數表達式。更多內容會在第八章描述。
4.屬性訪問表達式
屬性訪問表達式運算得到一個對象或者一個數組元素的值。javascript為屬性訪問定義了兩種方法。
代碼如下:
第一種寫法是一個表達式後跟隨一個句點和標識符。表達式指定對象,標識符則指定要訪問的屬性明川。
第二章寫法是使用方括號,方括號內是一個表達式(這種方法適用於對象和數組)。第二個表達式指定要訪問的屬性的明川或者代表要訪問數組元素的索引。這裡有一些具體的例子
代碼如下:
不管使用哪種形式的屬性訪問表達式,在"."和"["之前的表達式總會首先計算。如果計算結果為null或者undefined,表達式會拋出類型錯誤異常,因為這兩個值都不能包含任意屬性。如果運算結果不是對象或數組,javascript會將其轉換為對象(3章6節內容)
雖然.identifier的寫法更加簡單,但需要注意的是,這種方式只適用於要訪問的屬性名稱是合法的標識符。並且需要知道要訪問的屬性名字。如果屬性名稱是一個保留字或者包含空格和標點符號,是一個數字(對於數組來說),則必須使用方括號的寫法。當屬性名是通過運算符得出的值而不是固定值的時候,這時候必須使用方括號的寫法。(6章2節1小節)
5.調運表達式
javascript中的調用表達式(invocation expression)是一種調用(或者執行)函數或方法的語法表示。它以一個函數表達式開始,這個函數表達式指代了要調用的函數。函數表達式後跟隨一對圓括號,括號內是一個以逗號隔開的參數列表。參數可以有0個也可以有多個。
f(0) //f是一個函數表達式:0是一個參數表達式。
Math.max(x,y,z) //Math.max是一個函數;x,y和z是參數
a.sort() //a.sort()是一個函數,它沒有參數。
當調用表達式進行求值的時候,首先計算函數表達式,然後計算參數表達式,得到一組參數值。如果函數表達式的值不是一個可調用的對象,則拋出一個類型錯誤異常.然後參數的值依次被賦值給形參,這些形參是定義函數時定義的。接下來執行函數體。如果函數使用return語句給出一個返回值,那麼這個返回值就是整個調用表達式的值。否則,調用表達式的值就是undefined.函數調用--包括形參表達式的個數和函數定義中實參的個數不匹配的時候運行的情況--的細節將會在第八章詳細說明。
任何一個調用表達式都包含一對圓括號和左圓括號之前的表達式,如果這個表達式是一個屬性訪問表達式,那麼這個調用叫做“方法調用”(method invication)。在方法調用中執行函數體的時候,作為屬性訪問主體的對象和數組便是其調用方法內this的指向。這種特性使得在面向對象編程的范例中,函數(其OO名稱為“方法”)可調用其宿主對象(第9章會有更多相關內容)。
6.對象創建表達式
對象創建表達式(object creation expression)創建一個對象並調用一個函數(構造函數)來初始化對象的屬性。對象創建表達式和函數調用表達式非常類似,只是對象創建表達式之前多了一個關鍵字new:
new Object()
new Point(2,3)
如果對象創建表達式不需要傳入任何參數給構造函數的話,那麼這對圓括號是可以省略掉的,更多構造函數的細節將在9章說明
new Object
new Point
7.運算符概述
javascript中的運算符用於算表表達式, 比較表達式, 邏輯表達式 ,賦值表達式等
需要注意的是大多運算符都是標點符號來表示的,比如delete和instanceof.無論是關鍵字運算符還是符號運算符,所表示的運算符一樣都是正規運算符,他們的語法都非常言簡意赅。
下標運算符的優先級來排序的,前邊的運算符優先級高於後邊的運算符優先級。被水平華豐隔開的運算符具有不同的優先級。
A表示運算符的結合性。
L從左至右或者R(從右至左)
標題N的列表表示操作數的個數。
類型表示期望的操作數的類型,以及運算符的結果類型(在"→"符號之後)
運算符 操作 A N 類型 ++ 前/後增量 R 1 lv