初學者會以爲操做符的知識很簡單,可是隨着學習的深刻會發現不少語句均可以用操做符來簡化,因此深刻理解操做符能夠幫助你寫出高性能的代碼。這篇文章主要記錄不一樣操做符所遵循的規則。
javascript的操做符有一元操做符、位操做符、布爾操做符、乘性操做符、加性操做符、關係操做符、相等操做符、條件操做符、賦值操做符。其中值得注意的是,一元操做符和相等操做符都有可能改變操做數的數值類型。js中的操做符的不一樣之處在於,它們可以適用於不少值,例如字符串、數字值、布爾值、甚至對象。不過在應用於對象時,相應的操做符都會調用對象的valueOf()方法或者toString()方法來轉換成能夠操做的數據類型。javascript
遞增操做符 ++java
遞減操做符 --express
正數 +函數
負數 -性能
遞增和遞減操做符遵循的規則.
1.在應用於包含有效數字的字符串時,先將其轉換爲數字值,再執行加減1的操做。字符串變量變成數值變量。
2.在應用於一個不包含有效數字字符的字符串時,將變量的值設置爲NaN。字符串變量變成數值變量。
3.在應用於布爾值false/true時,先將其轉換爲0再執行加減1的操做。布爾值變量變爲數值變量。
4.在應用於浮點數值時,執行加減1的操做。
5.在應用於對象時,先調用對象的valueOf()方法以取得一個可供操做的值,而後對該值應用前面的四條規則。若是結果是NaN,則在調用toSring()方法後再應用前面的規則。對象變量變成數值變量。學習
var num = 1; ++num; //2 var num ='12s'; ++num; //NaN typeof num; //number var num = false; ++num; //1 typeof num; //number
位操做符用於最基本的層次上,咱們通常比較少用到。ECMAscript中全部數值都以IEEE-754 64位格式存儲,可是位操做符並不直接操做64位的值,而是先將64位轉換成32位的整數,而後執行操做,最後將結果轉換回64位。這會帶來一個嚴重的副效應,即在對特殊的NaN和Infinity值應用位操做時,兩個值都會被當作0來處理。測試
按位非 ~spa
按位與 &code
按位或 |對象
按位異或 ^
左移 <<
有符號右移 >>
無符號右移 >>>
布爾操做的重要性不言而喻。布爾操做用來測試兩個值的關係,若是沒有它們,那麼如if...else
這類的判斷語句也就無用武之地了。
邏輯非 !
邏輯與 &&
邏輯或 ||
只操做1個操做數,不管操做數是什麼數據類型,都返回一個布爾值。邏輯非操做不會改變操做數的數據類型。
邏輯非(!)操做符的規則:
1.若是操做數是一個對象,則返回false。
2.日字旁操做數是一個空字符串,則返回true。
3.若是操做數是一個非空字符串,則返回false。
4.若是操做數值是0,則返回true。
5.若是操做數是任意非0數值(包括Infinity),返回false。
6.若是操做數是null,返回true。
7.若是操做數是NaN,返回true。
8.若是操做數是undefined,返回true。
邏輯與有兩個操做數,它能夠應用於任何類型的操做數,而不單單是布爾值。在有一個操做數不是布爾值的狀況下,邏輯與操做就不必定返回布爾值。
邏輯與(&&)操做符的規則
1.若是第一個操做數是對象,則返回第二個操做數。
2.若是第二個操做數是對象,則只有在第一個操做數的求值結果爲true時才返回這個對象。
3.若是兩個操做數都是對象,則返回第二個操做數。
4.若是有一個操做數時null,則返回null。
5.若是有一個操做數時undefined,則返回undefined。
可見邏輯與是一種短路操做,若是第一個操做數可以決定結果(如null,undefined),那麼就不會對第二個操做數求值。
var a = {}; var b; a && b; //undefined var a = 3; var b = {}; a && b; //b var a = null; var b = {}; a && b; //null
邏輯或的操做數有兩個,若是其中有一個操做數不是布爾值,邏輯或也不必定返回布爾值,它遵循的規則以下:
1.若是第一個操做數是對象,則返回第一個操做數;
2.若是第一個操做數求值結果爲false,則返回第二個操做數;
3.若是兩個操做數都爲對象,則返回第一個操做數;
4.若是兩個操做數都是null,則返回null;
5.若是兩個操做數都是NaN,則返回NaN;
6.若是連個操做數都是undefined,則返回undefined。
可見邏輯或也是一種短路語句,若是第一個操做數的求值結果爲true則不會對第二個操做數進行求值。
注意:由以上規則可知,邏輯操做符均不會改變操做數的數據類型。
利用邏輯與來避免爲變量賦null或者undefined的值,以下:
var myObject = preferObject || backupObject;
乘性操做符和其餘語言中的乘性操做符用法相似,只不過在操做數爲非數值的狀況下會執行自動的類型轉換。即參與乘性計算的某個操做數不是數值,會先使用Number()轉型函數將其轉換爲數值。可是乘性操做不會改變操做數數值類型。
乘法(*)
除法(/)
求模(%)
var a = 1; var b = false; a*b; //0 typeof b; //boolean
加性操做符在操做數都爲數值的時候執行常規的加減法操做,在爲非數值時會有特殊的轉化規則。可是同乘性操做符同樣加性操做符不會改變數值類型。
加法(+)
減法(-)
加性操做符在有操做數爲字符串時遵循如下規則:
1.若是兩個操做數都爲字符,則將第二個操做數與第一個操做數拼接起來;
2.若是隻有一個操做數是字符串,則將另外一個操做數轉換爲字符串,而後將兩個字符串拼接起來;
1.若是有一個操做數是字符串,布爾值、null或者undefined,則先調用Number()方法,而後再根據數值減法規則執行減法計算。
2.若是有一個操做數是對象,則調用對象的valueOf()方法取得該對象的數值。若是對象沒有valueOf()方法方法,則調用tostring()方法並將獲得的字符串轉換爲數值。
小於(<)
大於(>)
小於等於(<=)
大於等於(>=)
相等(==)
不相等(!=)
全等(===)
不全等(!==)
這組操做符是先轉換再比較,即操做符會改變操做數的數值類型。
1.若是有一個操做數是布爾值,則在比較以前會轉換爲數值;
2.一個操做數是字符,另外一個是數值,那麼在比較相等性以前會將字符串轉換爲數值再進行比較;
3.若是一個操做符是對象,另外一個不是,則調用valueOf()方法,將獲得的結果進行比較。
4.若是兩個都是對象,則比較是不是同一個對象,若是兩個操做數都指向同一個對象,那麼認爲它們相等。
var a = '3'; var b = 3; a == b; //true typeof a; //number var a = {}; var b = {}; a == b; //false var a = {}; var b = a; var c = a; b == c; //true
全等和不全等操做符不會改變操做數的數值類型。
value = boolean_expression ? true_value : false_value
條件操做符會根據boolean_expression的求值結果來決定給變量value賦哪一個值,求值爲真是賦true_value值,爲假時賦false_value值。
賦值(=)
乘/賦值(*=)
初/賦值(/=)
模/賦值(%=)
加/賦值(+=)
減/賦值(-=)
左移/賦值(<<=)
無符號右移/賦值(>>>=)
有符號右移/賦值(>>=)
逗號操做符用於在一條語句中執行多個操做。
var num1=1, num2=2, num3=3;