標籤:
說起運算子,基本上各類程式設計語言中都會涉及,使用方法大同小異。今天在這裡以javascript做簡單的整理。
總得來說運算子還是比較的多,大致可以分為以下幾種類型:
- 一元運算子
- 位元運算符
- 布林運算子
- 乘性運算子
- 加性運算子
- 關係運算子
- 等性運算子
- 條件運算子
- 賦值運算子
- 逗號運算子
可以說只要學習過變成語言對這些運算子應該是並不陌生的,只要有邏輯或者是計算都會用到上面的運算子,之前我也是比較零散的使用過,從來沒有系統的學習和整理過這些運算子到底怎麼使用?之間有什麼區別和聯絡?有什麼使用上的技巧?今天,就以上述提到的問題進行學習和解釋。
一元運算子
delete運算子,刪除之前定義的對象屬性或方法的引用,當刪除失敗的時候,返回false,那什麼時候會刪除失敗呢?第一不能刪除聲明的變數(變數、函數、函數參數),如:var a = 1;第二不能刪除內建對象的方法,如:Math.PI;第三定義的變數屬性的configurable值為false的,不能刪除。需要注意的是,在IE6-8下,delete window屬性會報類型錯誤。具體的可以瞭解一下之前寫的javascript的delete機制
void運算子,對任何值返回undefine,該運算子常用於避免輸出不應該輸出的值。我們常見的是<a href=“javascript:void();”>點我</a>這樣這個連結就沒有效果了,就是因為返回了一個undefine,不執行a標籤的預設事件了,相當於執行了return false。
前增量/前遞減運算子,指的是變數自身數值上增1或者減1。後增量/後遞減運算子,指的也是變數自身數值上增1或者減1。他們的區別在於,如果將這個運算賦值的話是有區別的:
var fnum = 1;var bnum = 1;var forward = ++fnum; //fnum = 2; forward = 2;var back = bnum++; //bnum = 2; back = 1//遞減運算子結果是類似的
一元加法和一元減法運算子,一元加法和減法對數字是一樣的,就是數學上的加減運算,但是一元加法在字串中卻有著神奇的效果。涉及到javascript的資料類型轉化,有興趣的同學也可以在此瞭解一二。
位元運算符
學習位元運算符之前,需要知道的是位元運算符是在數字底層(即表示數位32個數位)進行操作的。ECMAScript整數分為兩種類型:有符號整數(允許正數和負數)和不帶正負號的整數(只允許正數)。在ECMAScript中,預設使用有符號整數。這意味著,有31位表示數值,一位表示符號,其中0表示負數,1表示正數。負數也儲存為二進位代碼,不過採用的是二進位補碼的形式。那麼二進位補碼怎麼計算呢?首先求出數字絕對值的二進位碼也叫做原碼,然後求出該原碼的反碼,最後將反碼加1就是補碼了。有趣的是,ECMAScript並不是以二進位補碼的形式顯示的,而是將數值的絕對值的二進位碼前加負號進行顯示。
var num1 = 18;var num2 = -18;num1.toString(2); // ‘10010’num 2.toString(2); // ‘-10010’
瞭解了這個基礎,就可以來學習js中的位元運算符了。
位元運算符NOT,是由~表示的,它的計算過程是:首先將運算數轉成32位元字,然後轉化成它的反碼,最後把二進位轉成浮點數。其實這個過程還是很難轉化的,位元運算NOT實質上,就是對數值求負然後減1(這裡所說的都是按整數位計算)。
位元運算AND,是由&表示的,將數值分別換算成二進位,然後按位AND運算,運算規則如下:
|
第一個數字中的數位 |
第二個數字中的數位 |
結果 |
|
1 |
1 |
1 |
|
1 |
0 |
0 |
|
0 |
1 |
0 |
|
0 |
0 |
0 |
位元運算OR,是由|表示的,將數值分別換成二進位,然後按位OR運算,運算規則如下:
|
第一個數字中的數位 |
第二個數字中的數位 |
結果 |
|
1 |
1 |
1 |
|
1 |
0 |
1 |
|
0 |
1 |
1 |
|
0 |
0 |
0 |
位元運算XOR,是由^表示的,將數值分別換算成二進位,然後按位XOR運算,運算規則如下:
|
第一個數字中的數位 |
第二個數字中的數位 |
結果 |
|
1 |
1 |
0 |
|
1 |
0 |
1 |
|
0 |
1 |
1 |
|
0 |
0 |
0 |
左移運算,是兩個小於符號(<<)。它把數字中所有數位向左移動指定數量。移動之後,右邊補零,然後轉換成十進位即可。如:
var num = 2; // 二進位為:’10‘var newNum = num << 5;console.log(newNum); // 64 二進位為:’1000000’
有符號右移運算子,由兩個大於符號(>>)表示。它把數字中所有數位向右移動指定數量,保留符號位。移動之後,左邊補零,然後轉換成十進位即可。如:
var num = 64; // 二進位為:’1000000’var newNum = num >> 5;console.log(newNum); //2 二進位為:’10’
無符號右移運算子,由三個大於符號(>>>)表示。這個和有符號右移的區別是,無符號需要整體移動,這樣一個負數就會變成一個正數。所以在使用的時候需要小心。
布林運算子
學習之前,需要知道其他資料類型是怎麼轉換成布爾類型的,如下:
|
參數類型 |
結果 |
|
undefine |
false |
|
null |
false |
|
boolean |
不轉換 |
|
number |
0是false,NAN是false,其他為true |
|
string |
Null 字元串為false,其他為true |
|
object |
true |
邏輯NOT運算子,使用!表示。是一個求非的過程。
邏輯AND運算子,使用&&表示,兩邊的運算式只有兩個都是true,結果才是true,其他情況都是false。
邏輯OR運算子,使用||表示,兩邊的運算式只有兩個都是false,結果才是false,其他情況都是true。
需要注意的是,如果&&和||不在條件陳述式中使用的話,他們的運算是從左向右的。如:
1 && 2 //1為true,繼續計算,2也為true,所以結果是20 && 1//0為false,所以就不會向右計算了,結果就是01 || 2 //1為true,所以結果是10 || 1 //0為false,繼續計算,1為true,所以結果為1
乘性運算子
乘法運算子,用*號表示,數學中的乘法運算。
除法運算子,用/號表示,數學中的除法運算。
模數運算子,用%號表示,數學中的除法運算取整。
加性運算子
正常的加減法計算。
關係運算子
常規的比較方式,數值之間大於、小於、大於等於、小於等於。
比較數字和字串,如果都是數位字串,那就轉化成數字然後比較大小,如果一個數值一個字串或者兩個都是字串,就比較字元代碼的前後順序。
等性運算子
等號和非等號,這個需要運算子兩邊的運算式應該進行資料類型轉換。規則如下:
執行類型轉換的規則如下:
如果一個運算數是 Boolean 值,在檢查相等性之前,把它轉換成數字值。false 轉換成 0,true 為 1。
如果一個運算數是字串,另一個是數字,在檢查相等性之前,要嘗試把字串轉換成數字。
如果一個運算數是對象,另一個是字串,在檢查相等性之前,要嘗試把對象轉換成字串。
如果一個運算數是對象,另一個是數字,在檢查相等性之前,要嘗試把對象轉換成數字。
在比較時,該運算子還遵守下列規則:
值 null 和 undefined 相等。
在檢查相等性時,不能把 null 和 undefined 轉換成其他值。
如果某個運算數是 NaN,等號將返回 false,非等號將返回 true。
如果兩個運算數都是對象,那麼比較的是它們的引用值。如果兩個運算數指向同一對象,那麼等號返回 true,否則兩個運算數不等。
重要提示:即使兩個數都是 NaN,等號仍然返回 false,因為根據規則,NaN 不等於 NaN。
全等號和非全等號,這個在運算時,不進行資料類型轉換,先判斷類型再判斷值。
條件運算子
也稱為三目運算子,三個運算式,只一個運算式為真時,結果為第二個運算式的值,第一個運算式為假時,結果為第三個運算式的值。
賦值運算子
我們定義變數是最常用,使用=號。另外主要的算數運算子都可以與賦值運算子配合使用。如:*=、+=等等。
逗號運算子
逗號運算子,可以在一條語句中執行多個運算。逗號運算子常用在變數聲明中。如:
var a = 1, b = 2, c = 3; // a=1;b=2;c=3var a = 1,2,3; // a=3 ,最後一個值var d = (a=1,b=2,c=3); //d的值是什麼呢?
大家接觸比較少的主要是位元運算符,其實位元運算符在許可權處理特別的方便。
javascript運算子整理