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

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

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

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á)式實(shí)際上是一個(gè)新創(chuàng)建的對象和數(shù)組。也可稱為“對象直接量”和“數(shù)組直接量”。

var arr = []  

var p = {};

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

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

var f = function(){}

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

var arr =[1];  

var p = {x:1}  

arr[0]  

p.x

注意:在“.”和“[”之前的表達(dá)式總是會(huì)首先計(jì)算,如果計(jì)算結(jié)果是null或undefined,表達(dá)式會(huì)拋出一個(gè)類型錯(cuò)誤異常,因?yàn)檫@兩個(gè)值都不能包含任何屬性。

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)建一個(gè)對象并調(diào)用一個(gè)函數(shù)(這個(gè)函數(shù)稱做構(gòu)造函數(shù))初始化新對象的屬性。

new Object()

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

2算術(shù)運(yùn)算符

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

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

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

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

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

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

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

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

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


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

1 + 2 //3  

'hello' + ' world' //hello world

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

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

++a;

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

a++;


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

var a = 1;

a++;  // 1

++a;  // 2

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

var a = 3;

a--;  //3

--a;  //2


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

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

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

== 相等  

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

!= 不相等  

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

< 小于  

<= 小于或等于  

> 大于  

>= 大于或等于

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

小于(<)  

大于(>)  

小于等于(<=)  

大于等于(>=)

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

true && 1;  //1

'' && 'f'  //""

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

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

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

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

!true;  //false

!false; //true

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

undefined  

null  

false  

0(包括+0和-0)  

NaN  

空字符串('')

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

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位運(yùn)算符

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

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

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

否運(yùn)算(not):符號(hào)為~,表示對一個(gè)二進(jìn)制位取反。   

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

左移運(yùn)算(left shift):符號(hào)為<<。   

右移運(yùn)算(right shift):符號(hào)為>>。   

帶符號(hào)位的右移運(yùn)算(zero filled right shift):符號(hào)為>>>

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

var o = {x:1};

"x" in o //true


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

var a = new Array();

a instanceof Object; //true


注意:所有對象都是Object的實(shí)例。

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

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


4.4typeof運(yùn)算符
typeof是一元運(yùn)算符,用來判斷類型。

typeof 1  // 'number'


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

var o={x:1}  

delete o.x;  

"x" in o //false


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

void 0  //undefined

void(0)  //undefined


var a = 1;

void (a=2);

a  //2

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

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


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

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


var a = 0;

var b = (a++,5);

a //1

b //5


5、運(yùn)算順序

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

5.2圓括號(hào)
圓括號(hào)(())可以用來提高運(yùn)算的優(yōu)先級(jí),因?yàn)樗膬?yōu)先級(jí)是最高的,即圓括號(hào)中的表達(dá)式會(huì)第一個(gè)運(yùn)算。
注意:因?yàn)閳A括號(hào)不是運(yùn)算符,所以不具有求值作用,只改變運(yùn)算的優(yōu)先級(jí)。

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)