JavaScript學(xué)習(xí)筆記整理(7):表達(dá)式和運算符

2018-06-19 11:59 更新
      表達(dá)式(expression)是JavaScript中的一個短語,JavaScript解釋器會將其計算出一個結(jié)果。

將簡單表達(dá)式組合成復(fù)雜表達(dá)式最常用的方法就是使用運算符(operator)。運算符按照特定的運算規(guī)則對操作數(shù)進(jìn)行運算,并計算出新值。

1、表達(dá)式

1.1原始表達(dá)式
原始表達(dá)式是表達(dá)式的最小單位---它們不包含其他表達(dá)式。

JavaScript中的原始表達(dá)式包含常量、直接量、變量或關(guān)鍵字。

直接量是直接在程序中出現(xiàn)的常數(shù)值。

1.2  

"hello"

保留字

true  

flase  

null  

this

變量

i  

num


1.2對象和數(shù)組的初始化表達(dá)式

對象和數(shù)組初始化表達(dá)式實際上是一個新創(chuàng)建的對象和數(shù)組。也可稱為“對象直接量”和“數(shù)組直接量”。

var arr = []  

var p = {};

注意:JavaScript對數(shù)組初始化表達(dá)式和對象初始化表達(dá)式求值的時候,數(shù)組初始化表達(dá)式和對象初始化表達(dá)式的元素表達(dá)式也都會各自計算一次。也就是說,元素表達(dá)式每次計算的值有可能是不同的。

1.3函數(shù)定義表達(dá)式
函數(shù)定義表達(dá)式(函數(shù)直接量)定義一個JavaScript函數(shù)。表達(dá)式的值是這個新定義的函數(shù)。

var f = function(){}

1.4屬性訪問表達(dá)式
屬性訪問表達(dá)式運算得到一個對象屬性或一個數(shù)組元素的值。

var arr =[1];  

var p = {x:1}  

arr[0]  

p.x

注意:在“.”和“[”之前的表達(dá)式總是會首先計算,如果計算結(jié)果是null或undefined,表達(dá)式會拋出一個類型錯誤異常,因為這兩個值都不能包含任何屬性。

1.5調(diào)用表達(dá)式
JavaScript中的調(diào)用表達(dá)式是一種調(diào)用函數(shù)或方法的語法表示。

f()  

a.sort()

1.6對象創(chuàng)建表達(dá)式
對象創(chuàng)建表達(dá)式創(chuàng)建一個對象并調(diào)用一個函數(shù)(這個函數(shù)稱做構(gòu)造函數(shù))初始化新對象的屬性。

new Object()

JavaScript中的大多數(shù)運算符是一個二元運算符。不過,JavaScript支持一個三元運算符(ternary operator),條件判斷運算符“?:”,它將三個表達(dá)式合并成一個表達(dá)式。

2算術(shù)運算符

加法運算符(Addition):x + y  

減法運算符(Subtraction): x - y  

乘法運算符(Multiplication): x * y  

除法運算符(Division):x / y  

余數(shù)運算符(Remainder):x % y  

自增運算符(Increment):++x 或者 x++  

自減運算符(Decrement):--x 或者 x--  

數(shù)值運算符(Convert to number): +x  

負(fù)數(shù)值運算符(Negate):-x


2.1 加法運算符
加法運算符(+)可以對兩個數(shù)字做加法,也可以做字符串連接操作。

1 + 2 //3  

'hello' + ' world' //hello world

加法運算符的行為表現(xiàn)為:
  • 如果其中一個操作數(shù)是對象,則對象會遵循對象到原始值的轉(zhuǎn)換規(guī)則轉(zhuǎn)為為原始類值;日期對象通過toString()方法執(zhí)行轉(zhuǎn)換,其他對象則通過valueOf()方法執(zhí)行轉(zhuǎn)換,如果結(jié)果還不是原始類型的值,再執(zhí)行toString方法;
  • 在進(jìn)行了對象到原始值的轉(zhuǎn)換后,如果其中一個操作數(shù)是字符串的話,另一個操作數(shù)也會轉(zhuǎn)換字符串,然后進(jìn)行字符串連接。
  • 否則,兩個操作數(shù)都將轉(zhuǎn)換為數(shù)字(或者NaN),然后進(jìn)行加法操作。
2.2一元算術(shù)運算符
一元算術(shù)運算符作用于一個單獨的操作數(shù),并產(chǎn)生一個新增。

在JavaScript中,一元算術(shù)運算符具有很高的優(yōu)先級,而且都是右結(jié)合。 (1)一元加法(+)
一元加法運算符把操作數(shù)轉(zhuǎn)換為數(shù)字(或者NaN),并返回這個轉(zhuǎn)換后的數(shù)字。如果操作數(shù)本身就是數(shù)字,則直接返回這個數(shù)字。
(2)一元減法(-)
當(dāng)“-"用做一元運算符時,它會根據(jù)需要把操作數(shù)轉(zhuǎn)換為數(shù)字,然后改變運算結(jié)果的符號。
(3)遞增(++)
遞增“++”運算符對操作數(shù)進(jìn)行增量(加-)操作。運算符將操作數(shù)轉(zhuǎn)換為數(shù)字,然后給數(shù)字加1,并將加1后的數(shù)值重新賦值給變量、數(shù)組元素或?qū)ο髮傩浴?/div>
前增量
運算符在操作數(shù)之前。

++a;

后增量
運算符在操作數(shù)之后。

a++;


兩者的區(qū)別
后增量會先返回變量操作前的值,再進(jìn)行自增操作;前增量會先進(jìn)行自增操作,再返回變量操作后的值。

var a = 1;

a++;  // 1

++a;  // 2

注意:由于JavaScript會自動進(jìn)行分號補(bǔ)全,因此不能再后增量運算符和操作數(shù)直接插入換行符。 遞減(--)
遞減運算符和”++“運算符一樣,返回值也依賴于它相對操作數(shù)的位置。

var a = 3;

a--;  //3

--a;  //2


3、關(guān)系運算符、邏輯運算符、賦值運算符、位運算符

3.1關(guān)系表達(dá)式

關(guān)系運算符用于測試兩個值之間的關(guān)系,根據(jù)關(guān)系是否存在而返回true或false。

== 相等  

=== 嚴(yán)格相等  

!= 不相等  

!== 嚴(yán)格不相等  

< 小于  

<= 小于或等于  

> 大于  

>= 大于或等于

相等和不等運算符
"=="和"==="運算符用于比較兩個值是否相等。
"!="和"!=="運算符的檢測規(guī)則是"=="和"==="運算符的求反。 比較運算符

小于(<)  

大于(>)  

小于等于(<=)  

大于等于(>=)

3.2邏輯表達(dá)式
邏輯運算符是對操作數(shù)進(jìn)行布爾算術(shù)運算,經(jīng)常和關(guān)系運算符一起配合使用。 邏輯與(&&) 且運算符的運算規(guī)則是:如果第一個運算子的布爾值為true,則返回第二個運算子的值(注意是值,不是布爾值);如果第一個運算子的布爾值為false,則直接返回第一個運算子的值,且不再對第二個運算子求值。

true && 1;  //1

'' && 'f'  //""

邏輯或(||) 或運算符(||)的運算規(guī)則是:如果第一個運算子的布爾值為true,則返回第一個運算子的值,且不再對第二個運算子求值;如果第一個運算子的布爾值為false,則返回第二個運算子的值。

'a' || '' // "a"

'' || 'a' //"a"

邏輯非(!) 取反運算符形式上是一個感嘆號,用于將布爾值變?yōu)橄喾粗?,即true變成false,false變成true。

!true;  //false

!false; //true

對于非布爾值的數(shù)據(jù),取反運算符會自動將其轉(zhuǎn)為布爾值。規(guī)則是,以下六個值取反后為true,其他值取反后都為false。

undefined  

null  

false  

0(包括+0和-0)  

NaN  

空字符串('')

3.3.賦值表達(dá)式
JavaScript使用“=”運算符來給變量或熟悉賦值。
帶操作的賦值運算

x += y // 等同于 x = x + y  

x -= y // 等同于 x = x - y  

x *= y // 等同于 x = x * y  

x /= y // 等同于 x = x / y  

x %= y // 等同于 x = x % y  

x >>= y // 等同于 x = x >> y  

x <<= y // 等同于 x = x << y  

x >>>= y // 等同于 x = x >>> y  

x &= y // 等同于 x = x & y  

x |= y // 等同于 x = x | y  

x ^= y // 等同于 x = x ^ y


3.4位運算符

位運算符用于直接對二進(jìn)制進(jìn)行計算。

或運算(or):符號為|,表示若兩個二進(jìn)制位都為0,則結(jié)果為0,否則為1。   

與運算(and):符號為&,表示若兩個二進(jìn)制位都為1,則結(jié)果為1,否則為0。   

否運算(not):符號為~,表示對一個二進(jìn)制位取反。   

異或運算(xor):符號為^,表示若兩個二進(jìn)制位不相同,則結(jié)果為1,否則為0。   

左移運算(left shift):符號為<<。   

右移運算(right shift):符號為>>。   

帶符號位的右移運算(zero filled right shift):符號為>>>

有一點需要特別注意,位運算符只對整數(shù)起作用,如果一個運算子不是整數(shù),會自動轉(zhuǎn)為整數(shù)后再執(zhí)行。
4、其他運算符
4.1in運算符
in運算符希望它的左操作數(shù)是一個字符串或可以轉(zhuǎn)換為字符串,希望它的右操作數(shù)是一個對象。如果右側(cè)的對象擁有一個名為左操作數(shù)值的屬性名,則返回true。

var o = {x:1};

"x" in o //true


4.2instanceof運算符
instanceof運算符希望左操作數(shù)是一個對象,右操作數(shù)標(biāo)識對象的類。如果左側(cè)的對象是右側(cè)類的實例,則表達(dá)式返回true。

var a = new Array();

a instanceof Object; //true


注意:所有對象都是Object的實例。

4.3條件運算符(?:)
三元條件運算符用問號(?)和冒號(:),分隔三個表達(dá)式。如果第一個表達(dá)式的布爾值為true,則返回第二個表達(dá)式的值,否則返回第三個表達(dá)式的值。

x>0 ? x : -x; //求x的絕對值


4.4typeof運算符
typeof是一元運算符,用來判斷類型。

typeof 1  // 'number'


4.5delete 運算符
delete是一元操作符,它用來刪除對象的屬性或數(shù)組元素。

var o={x:1}  

delete o.x;  

"x" in o //false


4.6void運算符
void是一元運算符,它出現(xiàn)在操作數(shù)之前,操作數(shù)可以是任意類型。操作數(shù)會照常計算,但忽略計算結(jié)果并返回undefined。

void 0  //undefined

void(0)  //undefined


var a = 1;

void (a=2);

a  //2

這個運算符主要是用于書簽工具(bookmarklet),以及用于在超級鏈接中插入代碼,目的是返回undefined可以防止網(wǎng)頁跳轉(zhuǎn)。

<a href="javascript:void(0)"></a>


4.8逗號運算符(,)
逗號運算符是二元運算符,它的操作數(shù)可以是任意類型。它首先計算左操作數(shù),然后計算右操作數(shù),最后返回右操作數(shù)的值。

'a','b'  //"b"


var a = 0;

var b = (a++,5);

a //1

b //5


5、運算順序

5.1優(yōu)先級
JavaScript各種運算符的優(yōu)先級別(Operator Precedence)是不一樣的。優(yōu)先級高的運算符先執(zhí)行,優(yōu)先級低的運算符后執(zhí)行。

5.2圓括號
圓括號(())可以用來提高運算的優(yōu)先級,因為它的優(yōu)先級是最高的,即圓括號中的表達(dá)式會第一個運算。
注意:因為圓括號不是運算符,所以不具有求值作用,只改變運算的優(yōu)先級。

對于優(yōu)先級別相同的運算符,大多數(shù)情況,計算順序總是從左到右,這叫做運算符的“左結(jié)合”(left-to-right associativity),即從左邊開始計算。

但是少數(shù)運算符的計算順序是從右到左,即從右邊開始計算,這叫做運算符的“右結(jié)合”(right-to-left associativity)。其中,最主要的是賦值運算符(=)和三元條件運算符(?:)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號