js基礎之--操作符

操作符的問題,在嚴格的語法中不存在,但是在js中,因爲其會按照需求自動轉換數據類型,所以就出現了各種各樣的問題,也可以說是小技巧,僅供參考。

下面的總結來自:圖靈程序設計叢書"javascript高級程序設計"第三版。

一:一元操作符(++,--,+,-)
 這四個操作符對任何值都適用,包括數字,字符串,布爾值,和對象,在應用於不同的值時,其遵循的規則如下:
 1,在應用於一個包含有效數字字符的字符串(字符串中只能是數值類型的)時,先將其轉換成數字值,在執行操作,字符串變量變成數值變量。(我們最習慣的用法)。
 2,在應用於一個不包含有效數字字符的字符串時,麻將變量的值置爲NaN。
 3,在應用布爾值時,先將布爾值轉換成數字,true=1,false=0,之後再執行操作,布爾值變量變成了數值變量。
 4,在應用於對象時,先調用對象的valueof()方法已取得可供操作的值,再針對該值應用上面的三條規則。
 例:
  var s1 = "2";
  var s2 = "z";
  var s3 = false;
  var s4 = 1.1;
  var s5 = {valueOf:function(){
   return -1;
  }};
  s1++; //3
  s2++; //NaN
  s3++; //1
  s4--; //0.100000000000000009(由於浮點數的舍入誤差,所以浮點數在用於比較條件時,要特別注意)
  s5--; //-2
  alert(s1+"--"+s2+"--"+s3+"--"+s4+"--"+s5);
  var sw1 = "2";
  var sw2 = "z";
  var sw3 = false;
  var sw4 = 1.1;
  var sw5 = {valueOf:function(){
   return -1;
  }};
  sw1 = -sw1; //-2
  sw2 = -sw2; //NaN
  sw3 = -sw3; //0
  sw4 = +sw4; //1.1
  sw5 = +sw5; //-1
  alert(sw1+"**"+sw2+"**"+sw3+"**"+sw4+"**"+sw5);
二:位操作符
 該操作中的特殊在於負數,負數的操作會以其補碼進行,即一個負數會變轉換成本身的補碼,以補碼進行之後的操作。
 求補碼:首先求這個數值絕對值的二進制,求這個二進制的反碼(即0替換1,1替換0),得到的反碼加1。
 注意:有符號數,最高位是不允許操作的;Infinity和NaN在位操作時,會被當成0來處理。
 1,按位非(NOT)(~) -- 結果就是返回數值的反碼。
  var num1 = 25;
  var num2 = "z";
  num1 = ~num1;   //-26
  num2 = ~num2;   //-1
  alert(num1+"  "+num2);
  var num3 = 25;
  num3 = -num3 - 1;//-26  操作數的負值減1
  alert(num3);
 2,按位與(AND)(&)
 3,按位或(OR)(|)
 4,按位異或(XOR)(^)
 5,左移(<<) -- 左移之後,右側的空位以0填充。
 6,有符號右移(>>)
  最左側的符號位不變,右移之後的空位會用符號位的值進行填充。
  var num1 = 64;
  var num2 = -64;
  num1 = num1>>5;  //2
  num2 = num2>>5;  //-2 //先轉補碼,右移操作,再轉補碼
  alert(num1+"  "+num2);
 7,無符號右移(>>>)
  會將數值的所有32位都向右移動,對於正數來說,無符號右移和有符號右移的結果一樣。
  但是對於負數來說,無符號右移是以0來填充空位,而不像是有符號右移那樣以符號位的值來填充空位。
  根本差距就是:負數的無符號右移就是,把負數轉成補碼操作完之後,不再進行補碼轉換,就結束了
  var num1 = 64;
  var num2 = -64;
  num1 = num1>>5;  //2
  num2 = num2>>5;  //134217726 //先轉補碼,右移操作,結束
  alert(num1+"  "+num2);
  alert(num2.toString(2)); //111111111111111111111111110,再次對該二進制進行補碼轉換,就等於有符號的右移結果。
三:布爾操作符
 1,邏輯非(!)
  邏輯操作符首先會將它的操作數轉換爲一個布爾值,然後再求其反。
  規則:
  (1):如果操作數是一個對象,一個非空字符串,任意非0數值(包括Infinity)則返回false
  (2):空字符串,數值0,null,NaN,undefined,返回true;
  例:
  var s1 = "2";
  var s2 = "z";
  var s3 = false;
  var s4 = null;
  var s5 = {valueOf:function(){
   return false;
  }};
  alert(!s1+"  "+!s2+"  "+!s3+"  "+!s4+"  "+!s5);//false false true true false(不會按照返回值進行判斷)
 2,邏輯與(&&)
  邏輯與屬於短路操作,即如果第一個操作數可以決定結果(比如第一個操作數是false,則直接返回),那麼不會進行第二個操作數的操作求值。
  基本規則:
  (1):如果第一個操作數是對象,則返回第二個對象;(因爲對象布爾值爲true);
  (2):如果第二個操作數十對象,則只有在第一個操作數的求值結果是true時,纔會返回第二個對象。(如果第一個對象爲false,則結束,不會對第二個操作數進行求值)。
  (3):如果有一個操作數是null,則返回null;
  (4):如果有一個操作數是NaN,則返回NaN;
  (5):如果有一個操作數是undefined,則返回undefined;
  例:
  var s1 = "2";
  var s2 = "z";
  var s3 = false;
  var s4 = NaN;
  var s5 = {valueOf:function(){
   return false;
  }};
  alert(s2&&s1); //2
  alert(s3&&s5); //false
  alert(s5&&s4); //NaN
  alert(s4&&s5); //NaN
 3,邏輯或(||)
  邏輯或也屬於短路操作,即如果第一個操作數可以決定結果(比如第一個操作數是true,則直接返回),那麼不會進行第二個操作數的操作求值。
  基本規則:
  (1):如果第一個操作數是對象,則返回第一個對象;(因爲對象布爾值爲true);
  (2):如果第二個操作數十對象,則只有在第一個操作數的求值結果是false時,纔會返回第二個對象。(如果第一個對象爲true,則結束,不會對第二個操作數進行求值)。
  (3):如果兩個操作數都是對象,則返回第一個操作數。
  (4):如果兩個操作數是null,則返回null;
  (5):如果兩個操作數是NaN,則返回NaN;
  (6):如果兩個操作數是undefined,則返回undefined;
  (7):如果操作數爲false,null,NaN,undefined中的兩種,則返回後面的,如果有非這四種的,則返回其他的操作數。
  例:
  var s1 = "2";
  var s2 = "z";
  var s3 = false;
  var s4 = NaN;
  var s5 = {valueOf:function(){
   return false;
  }};
  var s6 = NaN;
  alert(s2||s1); //z
  alert(s3||s4); //NaN
  alert(s5||s4); //對象
  alert(s4||s5); //對象
四:乘性操作符
 1,乘法(*)
  規則:
  (1):超出範圍,則返回Infinity或者-Infinity
  (2):如果有一個操作數是NaN,則返回NaN
  (3):如果是Infinity與0相乘,則結果NaN
  (4):如果Infinity與非0值相乘,則結果Infinity或者-Infinity
  (5):如果Infinity與Infinity相乘,則結果Infinity
  (6):如果操作數不是數值,則轉換成數字值之後,再進行上面的操作。
 2,除法(/)
  規則:
  (1):正常操作超出範圍,返回Infinity或者-Infinity
  (2):如果有一個操作數是NaN,則返回NaN
  (3):如果Infinity除Infinity,則結果NaN
  (4):如果0除0,則結果NaN
  (5):如果非0數除以0,則結果爲Infinity或者-Infinity
  (6):如果有非數值,則轉換成數值進行上述操作
 3,求模(%)
  規則:
  (1):如果操作數都是數值,執行常規的除法計算,返回除得的餘數
  (2):如果被除數是無窮大而除數是有限大的數值,則結果是NaN
  (3):如果被除數是有限大的數值而除數是0,則結果NaN
  (4):如果是Infinity被Infinity除,則結果爲NaN
  (5):如果被除數是有限大的數值,而除數是無窮大的數值,則結果是被除數
  (6):如果被除數是0,則結果是0
  (7):如果有一個操作數不是數值,則在後臺調用Number()將其轉換爲數值,然後執行上面的操
五:加性操作符
 1,加法(+)
  規則:
  (1):如果有一個操作數是NaN,則結果爲NaN
  (2):如果是Infinity加Infinity,則結果爲Infinity(負值的那個類似)
  (3):如果是Infinity加-Infinity,則結果爲NaN
  (4):如果是+0加+0,則結果是+0
  (5):+0加-0,則結果爲+0
  (6):-0加-0,則結果爲-0(感覺這三個意義不大。還是對這些最基礎的瞭解不深。。)
  如果是字符串,
  (7):把所有的操作數轉成字符串,並把字符串連接起來
  注意:只要在一個加法表達式中,有字符串,就會把字符串之後的操作數轉成字符串,按照字符串進行操作。
  例,2+3+"4"  //結果爲54
   "4"+2+3  //結果爲423
   "4"+(2+3)//結果爲45
 2,減法(-)
  規則:
  (1):如果兩個操作數都是數值,則執行常規的算術劍法操作並返回結果
  (2):如果有一個操作數是NaN,則結果是NaN
  (3):如果Infinity或-Infinity減Infinity或-Infinity,則結果是NaN
  (4):如果Infinity或-Infinity減-Infinity或Infinity,則結果是Infinity或-Infinity
  (5):+0減+0,則結果是+0
  (6):+0減-0,則結果是-0
  (7):-0減-0,則結果是+0
  (8):如果有一個操作數是字符串,布爾型,null或者undefined,則現在後臺調用Number()函數將其轉換爲數值,然後再根據前面的規則處理
  (9):如果有一個操作數是對象,則調用對象的valueOf()方法以取得表示該對象的數值,如果對象沒有valueOf方法,則調用toString()轉換成字符串,再進行上述規則操作。
六:關係操作符
 規則:
 (1):如果兩個操作數都是數值,則執行數值比較
 (2):如果兩個操作數都是字符串,則比較兩個字符串對於的字符串編碼值
 (3):如果一個操作數是數值,則將另一個轉換爲數值,進行比較
 (4):如果一個操作數是對象,則用valueOf()方法,比較,若無valueOf()方法,則調用toString()方法,再用之前的比較
 (5):如果一個操作數是布爾值,則現將其轉換爲數值,然後再執行比較
 (6):任何數與NaN比較,結果都爲false
 例:
  var s1 = "23" < "3";  //true
  var s2 = "23" < 3;    //false
  var s3 = "a" < 3;     //false
  var s4 = NaN == 3;    //false
  var s5 = NaN < 3;     //false
  var s6 = NaN > 3;     //false
  alert(s1+"  "+s2+"  "+s3+"  "+s4+"  "+s5+"  "+s6);
  var s4 = null == 0;   //false
  var s5 = null < 1;    //true
  var s6 = null > 0;    //false
七:相等操作符
 1,相等和不相等---先轉換成匹配的類型再比較
  (1):如果是布爾值,則在比較相等性之前,轉換成數值
  (2):如果一個操作數是字符串,另外一個是數值,則先把字符串轉成數值,在比較
  (3):如果一個操作數是對象,另外一個不是,則先把對象用valueOf()方法,用得到的基本類型值按照前面的規則比較
  (4):null和undefined是相等的
  (5):要比較相等性之前,不能將null和undefined轉換成其他任何字符
  (6):只要有一個操作數爲NaN,則結果必定爲false,因爲NaN不等於NaN
  (7):如果兩個操作數都是對象,則比較它們是不是同一個對象,如果兩個操作數都指向同一個對象,則爲true
 2,全等和不全等---不需要轉換,直接比較
  直接,完全一樣纔會返回true
八:條件操作符
九:賦值操作符
十:逗號操作符

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