JavaScript中的一些特殊用法(二)

1. 非數值類型轉數值

使用Number()轉換時:javascript

  • undefined會轉爲NaN
  • 若是字符串以0開始,瀏覽器會忽略前導0,不會按照八進制進行轉換
  • 若是字符串以0x開始,瀏覽器會按照十六進制轉化爲十進制返回
  • 若是字符串有字符,除(+,-,.)外都會轉爲NaN,十六進制時,字符串包含任何非數字字符都返回NaN
  • 若是是對象轉換,則對象先使用valueof(),而後按照規則轉換。若是無valueOf方法,則調用toString方法,再轉換。

使用parseInt()轉換時:java

  • parseInt會忽略前導空格,直到第一個非空字符開始解析,若是爲非數字或正負號,則返回NaN。若是爲數字則一直解析到第一個非數字爲止。注:在parseInt中小數點不是有效的數字字符
  • parseInt能識別十進制,八進制和十六進制,可是在解析八進制時,ECMAScript 3 和ECMAScript 5存在分歧,ECMAScript 3會將070轉化爲56,可是ECMAScript 5會轉換爲70。
  • 使用parseInt的第二個參數
var num1 = parseInt("10",2);       //2  按二進制解析
var num2 = parseInt("10",8);       //8  按八進制解析
var num3 = parseInt("10",10);      //10 按十進制解析
var num4 = parseInt("10",16);      //16 按十六進制解析

使用parseFloat()轉換時:瀏覽器

  • parseFloat和parseInt的第一個區別在於它在解析字符串是是遇到一個無效的浮點數值字符爲止,比parseInt多了.
  • 解析十六進制數值時返回0
var num = parseFloat("0xA");   //0
var num = parseInt("0xA");     //10
  • parseFloat函數沒有第二個能夠指定基數的參數,因此只解析十進制值。
  • 若是字符串是個整數,則返回整數而不是浮點數
var num = parseFloat("2.125e7");  //31250000

2. 使用toString()輸出不一樣進制的數值

此條適用於整數,咱們能夠用toString()返回任意進制的整數。函數

var num = 10;
alert(num.toString());   //"10"
alert(num.toString(9));   //"11"
alert(num.toString(16));   //"a"

3. 位操做符時注意NaN和Infinity

在對NaN和Infinity使用位操做符時,這兩個數值都會被當成0來處理。 若是對於非數值應用位操做符,會先使用Number()函數將該值轉換爲一個數值。編碼

還有一點要注意的就是負數的無符號右移,無符號右移是以0來填充空位,而不像有符號右移以符號位填充空位,因此對正數的無符號右移和有符號右移結果相同,但對負數就不一樣了。無符號右移操做會把負數的二進制碼當成正數的二進制碼,並且負數是以補碼形式表示,所以會致使無符號右移後的結果相差很是大。code

var oldValue = -64;                       
var newValue = oldValue >>> 5

4. 特殊的數值運算

  • 對於數值運算,若是有一個操做數爲NaN,則結果爲NaN。
  • 對非數值應用使用一元加操做或減操做(+,-,正負號),若是該值沒法轉換爲數值(使用Number()方式轉換),則返回NaN。
var s1 = "01", s2 = "1.1", s3 = "z", b = false,
o = {
  valueOf: function(){
    return -1;
  }
};
s1 = +s1;   //1     +改成-:    -1
s2 = +s2;   //1.1             -1.1
s3 = +s3;   //NaN             NaN
b = +b;     //0               0
o = -o;    //-1               1
  • Infinity和0相乘等於NaN,和非0數相乘爲Infinity和-Infinity,取決於乘數的正負號。Infinity和Infinity相乘等於Infinity。
var num1 =Infinity, num2 = 0, num3 = -2 ,num4 = -Infinity;
alert(num1 * num2);     //NaN
alert(num1 * num3);     //-Infinity
alert(num1 * num4);     //-Infinity
  • 零除零爲NaN,非零數除以零爲Infinity或-Infinity。Infinity除以Infinity爲NaN
  • 對於取模運算,下面等式成立:
Infinity%2=NaN;
 2%-Infinity=2;
 0%Infinity=0;        //只要被除數爲0,除數不爲NaN,結果都爲0
 Infinity%0=NaN;      //被除數能夠爲任意數,除數只要爲0,結果都爲NaN
 Infinity%Infinity=NaN
  • 加法運算:若是兩個操做數都是字符串則+變爲字符串鏈接。若是一個爲字符串,一個爲數值,將數值轉換爲字符串,而後鏈接字符串,若是一個操做數是對象,布爾值則先調用它們的valueOf方法,如無,在調用toString方法。再根據返回值類型,判斷+號應該鏈接字符串仍是相加。
Infinity + -Infinity = NaN;

  var p = {
      valueOf: function () {
          return -1;
      }
  };
  var num =1;
  var result = num +p;
  alert(result);                   // 0  相加

  var p = {
      valueOf: function () {
          return "not a num";
      }
  };
  var num =1;
  var result = num +p;
  alert(result);                //1not a num  字符串鏈接
  • 減法運算:減法運算和加法運算十分類似,關於對象的處理也是同樣,因此再也不說明。
Infinity - Infinity = NaN;
-Infinity - -Infinity = NaN;

5. 關係操做符的使用

關係操做符就是小於(<)、大於(>)、小於等於(<=)和大於等於(>=)對象

  • 只要有一個數值,就會執行數值比較,另外一個不爲數值,則轉爲數值。對象先用valueOf,後用toString。其實對象不管執行什麼運算都是這樣,有valueOf,則用valueOf返回值,不然使用toString返回值。
  • 兩個都爲字符串,則比較字符串的字符編碼值(ASCII值)
  • 關於第一個還要注意,在一個時候字符串一個是數值時,字符串沒法轉數值時,即爲NaN會出現以下狀況
var result = "a" < 3;    //false a轉換爲NaN
var result = "a" >= 3;   //false 任何數和NaN進行相比都爲false
相關文章
相關標籤/搜索