#第4章 表達式和運算符
- <a href="#no1">4.1 原始表達式</a>
- <a href="#no2">4.2 對象和數組的初始化表達式</a>
- <a href="#no3">4.3 函數定義表達式</a>
- <a href="#no4">4.4 屬性訪問表達式</a>
- <a href="#no5">4.5 調用表達式</a>
- <a href="#no6">4.6 對象創建表達式</a>
- <a href="#no7">4.7 運算符概述</a>
- <a href="#no8">4.8 算術表達式</a>
- <a href="#no9">4.9 關系表達式</a>
- <a href="#no10">4.10 邏輯表達式</a>
- <a href="#no11">4.11 賦值表達式</a>
- <a href="#no12">4.12 表達式計算</a>
- <a href="#no13">4.13 其他運算符</a>
**表達式是JS中的一個短語。JS解釋器會將其計算出一個結果。**
##<a name="no1">4.1 原始表達式</a>
> 原是表達式是表達式的最小單位——它們不再包含其他表達式。JS中原始表達式包含常量或直接量、關鍵字和變量。
##<a name="no2">4.2 對象和數組的初始化表達式</a>
> 對象和數組初始化表達式實際上是一個新建的對象和數組。這些初始化表達式有時稱做“對象直接量”和“數組直接量”。它們不是原是表達式,因為它們所包含的成員或者元素都是子表達式。
##<a name="no3">4.3 函數定義表達式</a>
> 函數定義表達式定義一個JS函數。表達式的值是這個新定義的函數。
##<a name="no4">4.4 屬性訪問表達式</a>
> 屬性訪問表達式運算得到一個對象屬性或一個數組元素的值。JS為屬性訪問定義了兩種語法:
1. exoression.indentifier
2. expression[expression]
第一種方法寫法更加簡單,只適用于要訪問的屬性名稱是合法的標識符,并且需要知道要訪問的屬性的名字。
##<a name="no5">4.5 調用表達式</a>
> JS中的調用表達式是一種調用(或者執行)函數或方法的語法表示。它以一個函數表達式開始,這個函數表達式指代了要調用的函數。函數表達式后跟隨一對圓括號,括號內是一個以逗號隔開的參數列表。
##<a name="no6">4.6 對象創建表達式</a>
> 對象創建表達式創建一個對象并調用一個函數(這個函數稱作構造函數)初始化新對象的屬性。前面有一個關鍵字`new`。
##<a name="no7">4.7 運算符概述</a>
> JS中運算符用于算術表達式、比較表達式、邏輯表達式、賦值表達式等。
###4.7.1 操作數的個數
略
###4.7.2 操作數類型和結果類型
略
###4.7.3 左值
> 表達式只能出現在賦值運算符的左側。在JS中,變量、對象屬性和數組元素均是左值。
###4.7.4 運算符的副作用
略
###4.7.5 運算符優先級
> 《JavaScript權威指南-第六版》P66按照優先級從高到底排序。
###4.7.6 運算符的結合性
> 結合性指定了在多個具有同樣優先級的運算符表達式中的運算順序。
###4.7.7 運算順序
> JS中嚴格按照從左到右的順序來計算表達式。
##<a name="no8">4.8 算術表達式</a>
基本的算術運算符:
1. `*`(乘法)
2. `/`(除法)
3. `%`(求余)
4. `+`(加法)
5. `-`(減法)
###4.8.1 “+”運算符
> 二元加法運算符“+”可以對兩個數字做加法,也可以做字符串連接操作。
###4.8.2 一元算術運算符
> 一元算術運算符作用于一個單獨的操作數,并產生一個新值。
###4.8.3 位運算符
> 位運算符可以對由數字表示的二進制數據進行更低層級的按位運算。(`& 、 | 、 ^ 、 ~ 、 << 、 >> 、 >>>`)
##<a name="no9">4.9 關系表達式</a>
> 關系運算符用于測試兩個值之間的關系,根據關系是否存在而返回`true`或`false`。關系表達式總是返回一個布爾值。
###4.9.1 相等和不想等運算符
> `==`和`===`運算符用于比較兩個值是否相等。
> `!=`和`!==`與前面兩個相反。
> 它們之間的區別略。
###4.9.2 比較運算符
> 比較運算符用來檢測兩個操作數的大小關系(數值大小或者字母表的順序)。返回結果為布爾值。
1. `<`(小于)
2. `>`(大于)
3. `<=`(小于等于)
4. `>=`(大于等于)
###4.9.3 in運算符
> `in`運算符希望它的左操作數是一個字符串或可以轉換為字符串,希望它的右操作數是一個對象。如果右側的對象擁有一個名為左操作數值的屬性名,那么表達式返回`true`。
例如:
var point = {x:1, y:1}; //定義一個對象
'x' in point //=> true:對象有一個名為'x'的屬性
'z' in point //=> false:對象不存在一個名為'z'的屬性
'toString' in point //=> true:對象繼承了toString()方法
###4.9.4 instanceof運算符
> `instanceof`運算符希望左操作數是一個對象,右操作數標識對象的類。如果左側的對象是右側類的實例,則表達式返回`true`;否則返回`false`。
例如:
var d = new Date();
d instanceof Datel //=> true,d是由Date()創建的
d instanceof Object //=> true
d instanceof Number //=> false
##<a name="no10">4.10 邏輯表達式</a>
- `&&`
- `||`
- `!`
###4.10.1 邏輯與(`&&`)
> `&&`對兩個值執行布爾與(AND)操作,只有在第一個操作數和第二個操作數均為`true`時,它才返回`true`。如果其中一個操作數是`false`,它返回`false`。
###4.10.2 邏輯或(`||`)
> `||`運算符對兩個操作數做布爾或(OR)操作。如果其中一個或者兩個操作數是真值,它返回一個真值。如果兩個操作數都是假值,它返回一個假值。
###4.10.3 邏輯非(`!`)
> `!`運算符是一元運算符。它防止在一個單獨的操作數之前。它的目的是將操作數的布爾值進行求反。
##<a name="no11">4.11 賦值表達式</a>
> JS使用`=`運算符來給變量或者屬性賦值。
##<a name="no12">4.12 表達式計算</a>
> JS可以解釋運行由JS源代碼組成的字符串,并產生一個值。JS通過全局函數`eval()`來完成這個工作。
eval('3+2'); //=> 5
###4.12.1 eval()
> `eval()`只有一個參數。如果傳入的參數不是字符串,它直接返回這個參數。如果是字符串,它會當成JS代碼進行編譯,編譯失敗則拋出語法錯誤異常。如果編譯程剛,則開始執行這段代碼,并返回字符串中的最后一個表達式或語句的值,如果最后一個表達式或語句沒有值,則最終返回`undefined`。
###4.12.2 全局`eval()`
略(P85)
###4.12.3 嚴格`eval()`
略(P86)
##<a name="no13">4.13 其他運算符</a>
###4.13.1 條件運算符(?;)
> 條件運算符是JS中唯一一個三元運算符。條件運算符的操作數可以是任意類型。第一個操作數當成布爾值,如果它是真值,那么將計算第二個操作數,并返回其計算結果。否則,將計算第三個操作數,并返回其計算結果。第二個和第三個操作俗話總是會計算其中之一,不可能兩者同時執行。
###4.13.2 typeof 運算符
> `typeof`是一元運算符,放在其單個操作數的前面,操作數可以是任意類型。返回值為表示操作數類型的一個字符串。
###4.13.3 delete運算符
> `delete`是一元操作符,它用來刪除對象屬性或者數組元素。它是用來做刪除操作的,不是用來返回一個值的。
###4.13.4 void運算符
> `void`是一元運算符,它出現在操作數之前,操作數可以是任意類型。不是很常用。。。。
###4.13.5 逗號運算符(,)
> 逗號運算符是二元運算符,它的操作數可以是任意類型。它首先計算左操作數,然后計算右操作數,最后返回右操作數的值。
例:
i=0, j=1, k=2;
計算結果是2,它和下面的代碼基本上是等價的:
i=0; j=1; k=2;
**整章到P90完結**