javascript運算符語法概述

操作數個數

  javascript的運算符總共有46個,如果根據其操作數的個數進行分類,則大多數是二元運算符(binary operator),它們的操作數都是兩個,它們將兩個表達式合併成複雜表達式

1 + 2;true || false;

  javascript中的一元運算符(unary operator)將一個表達式轉換爲另一個稍複雜的表達式,主要包括以下9個:

++ -- - + ~ ! delete typeof void
a++;typeof true;

  javascript只有一個三元運算符(ternary operator),是條件判斷運算符?:,它將三個表達式合併成一個表達式

2>1 ? 2 : 1;

 

優先級

  運算符優先級控制着運算符的執行順序,優先級高的運算符的執行總是先於優先級運算符低的運算符

  46個運算符總共分爲14級的優先級,從高到低依次是:

複製代碼

1  ++ -- - + ~ ! delete typeof void2  * / %
3  + -
4  << >> >>>
5  < <= > >= instanceof in6  == != === !==
7  &
8  ^
9  |
10 &&
11 ||
12 ?:13 = *= /= %= += -= &= ^= |= <<= >>= >>>=
14 ,

複製代碼

  由這14級的運算符優先級等級可以看出:

一元運算符  > 算術運算符 > 比較運算符 > 邏輯運算符 > 三元運算符 > 賦值運算符 > 逗號運算符

  [注意]邏輯取反運算符屬於一元運算符,其優先級最高

例子

!2<1&&4*3+1;

  像上面這種情況就比較複雜,逐步來分解其運算順序

  先計算一元運算符!,!2;//false

//於是表達式變爲false < 1 && 4*3 + 1;

  計算算術運算符4*3+1;//13

//於是表達式變爲false < 1 && 13;

  計算比較運算符<,false<1;//true

//於是表達式變爲:true && 13;//13

  可以使用圓括號來強行指定運算次序

2+3*5;//17(2+3)*5;//25;

 

結合性

  運算符具有兩種結合性,一種是從左向右結合,記號爲L,一種是從右向左結合,記號爲R。結合性指定了在多個具有同樣優先級的運算符表達式中的運算順序

  多數運算符都具有從左向右的結合性,只有一元運算符、條件運算符和賦值運算符具有從右向左的結合性

w = x + y + z;//等價於:w = ((x + y)+ z);
w = x = y = z;//等價於:w = (x = (y = z));
q = a ? b : c ? d : e ? f : g;//等價於:q = a ? b : (c ? d : (e ? f : g));

  運算符的優先級和結合性決定了它們在複雜表達式中的運算順序,但子表達式相互有影響時,順序會發生變化

例子

a = 1;
b = a++ + a-- * a++;

  先分析該表達式中,根據優先級的順序,分別運算遞增運算符、乘法運算符、加法運算符和賦值運算符

  先計算第一個a++;//結果爲1,a爲2

//表達式變成b = 1 + a-- * a++;

  計算a--;//結果爲2,a爲1

//表達式變成b = 1 + 2 * a++;

  計算第二個a++;//結果爲1,a爲2

//表達式變成b = 1 + 2 * 1;

  所以,最終a = 2; b = 3;

a = 1;
b = a++ + a-- * a++;
console.log(a,b);//2 3
//類似地a = 1;
b = a-- * a++ + a++;
console.log(a,b);//2,1

 

類型

  一些運算符可以作用於任何數據類型,但仍然希望它們的操作數是指定類型的數據,並且大多數運算符返回一個特定類型的值,在下面的運算符規則表中,箭頭前爲運算符操作數的類型,箭頭後爲運算結果的類型

【左值】

  左值(lvalue)是一個古老的術語,指表達式只能出現在運算符的左側

  在javascript中,變量、對象屬性和數組元素都是左值

  遞增運算符++、遞減運算符--和賦值運算符的操作數類型是左值

var a = 3;
a++;//33--;//報錯({}).a += '1';//'undefined1''test' -= 'test';//報錯

 

運算符規則表

複製代碼

++                增量                 lval->--                減量                 lval->-                 求反                 num->+                 轉換爲數字            num->~                 按位求反              ->!                 邏輯非                bool->            刪除屬性              lval->            檢測類型              any->              返回undefined         any->******************************************************
* \ %             乘、除、求餘           num,num->******************************************************
+ -               加、減                num,num->+                 字符串連接             str,str->******************************************************
<<                左移位                ,->>>                有符號右移位           ,->>>>               無符號右移位           ,->******************************************************
< <= > >=         比較數字順序           num,num->< <= > >=         比較字母表順序         str,str->        測試對象類            obj,func->                測試屬性              str,obj->******************************************************
==                判斷相等              any,any->!=                判斷不等              any,any->===               判斷恆等              any,any->!==               判斷非恆等            any,any->******************************************************
&                 按位與                ,->******************************************************
^                 按位異或              ,->******************************************************
|                 按位或                ,->******************************************************
&&                邏輯與                any,any->******************************************************
||                邏輯或                any,any->******************************************************
?:                條件運算符             bool,any,any->******************************************************
=                  賦值                 lval,any->*= /= %=
+= -= &=          運算且賦值             lval,any->^= |= <<=
>>= >>>=
******************************************************->



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章