JavaScript 基本類型值-Number類型


▓▓▓▓▓▓ 大致介紹

  在JavaScript的內部采用IEEE754格式來表示數字,所以不區分整數和浮點數,都是用64位浮點數的形式儲存。就是說,在JavaScript內部,就根本沒有小數。但是有些運算必須得需要整數完成,所以JavaScript有時會把64位的浮點數轉換成32位的整數,再進行運算。

 

▓▓▓▓▓▓ 整數

  JavaScript對整數提供四種表示方法:

    1、二進制:有前綴0b的數值,出現0,1以外的數字會報錯

    2、八進制:有前綴0o的數值,或者是以0后面再跟一個數字(0-7)。如果超出了前面所述的數值范圍,則會忽略第一個數字0,視為十進制數

      注意:八進制字面量在嚴格模式下是無效的,會導致支持該模式的JavaScript引擎拋出錯誤

    3、十六進制:有前綴0x,后跟任何十六進制數字(0~9及A~F),字母大小寫都可以,超出范圍會報錯

    4、十進制

        var num2 = 0b11;
        console.log(num2); //3
        var num2 = 0b12;
        console.log(num2); //報錯

        var num8 = 0o76;
        console.log(num8); //02
        var num8 = 0o78;
        console.log(num8); //報錯

        var num16 = 0x2a;
        console.log(num16); //42
        var num16 = 0x2h;
        console.log(num16) //報錯

 

▓▓▓▓▓▓ 浮點數

  所謂浮點數,就是該數值中必須包含一個小數點,並且小數點后面必須至少有一位數字。與整數不同,浮點數只能用十進制來表示

  浮點數的精度遠遠不如整數,所以設計浮點數的運算好比較要小心

  例如:

        console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004
        console.log(0.6/0.2); //2.9999999999999996

 

▓▓▓▓▓▓ 科學計數法

  對於那些極大極小的數值,可以用e表示法(即科學計數法)表示的浮點數值表示。用e表示法表示的數值等於e前面的數值乘以10的指數次冪

  以下兩種情況,JavaScript會自動將數值轉為科學計數法表示,其他情況都采用字面形式直接表示。

    1、小數點前的數字多余21位

        console.log(1234567890123456789012);// 1.2345678901234568e+21

        console.log(123456789012365648787); //123456789012365660000

  

    2、小數點后面的0多余5位

        console.log(0.0000006);//6e-7

        console.log(0.000006); //0.000006

 

▓▓▓▓▓▓ 數值范圍

  由於內存的限制,ECMAScript並不能保存世界上所有的數值,所以就有了最大值和最小值

  最小值保存在Number.MIN_VALUE中,這個值是5e-324

  最大值保存在Number.MAX_VALUE,這個值是1.7976931348623157e+308

        console.log(Number.MIN_VALUE) //5e-324
        console.log(Number.MAX_VALUE); //1.7976931348623157e+308

 

  如果數字超過最大值,javascript會返回Infinity,這稱為正向溢出(overflow);如果等於或超過最小負值-1023(即非常接近0),javascript會直接把這個數轉為0,這稱為負向溢出(underflow)

  如果要想確定一個數值是不是有窮的,可以使用isFinite()函數。這個函數在參數位於最小與最大數值之間時會返回true

        var result = Number.MAX_VALUE + Number.MAX_VALUE;
        console.log(isFinite(result)); //false

 

▓▓▓▓▓▓ 特殊數值

  1、+0和-0

    這兩個0在大對數的情況下都是等價的

        -0 === +0; //true
        0  === -0; //true
        0 === +0; //true

  

  但是在作為分母的時候是不一樣的

        1/-0 == 1/+0; //false

 

  2、infinity

    Infinity表示“無窮”,用來表示兩種場景。一種是一個正的數值太大,或一個負的數值太小,無法表示;另一種是非0數值除以0,得到Infinity。

        Math.pow(2,Math.pow(2,100));//Infinity
        1/0;//Infinity

 

  Infinity參與的運算結果只能是其本身、0或NaN

    2 * Infinity;//Infinity
    2 - Infinity;//-Infinity
    2 + Infinity;//Infinity
    2 / Infinity;//0
    Infinity / 2;//Infinity
    Infinity * Infinity;//Infinity
    Infinity - Infinity;//NaN
    Infinity + Infinity;//Infinity
    Infinity / Infinity;//NaN                

 

  3、NaN

  這個數值表示一個本來要返回數值的操作數未返回數值的情況

  NaN與任何值不相等,包括它本身,並且涉及NaN的任何操作都會返回NaN

        5 - 'x'; //NaN
        Math.acos(2); //NaN
        0 / 0; //NaN
        NaN == NaN;//false
        NaN == Infinity;//false    

  

  NaN不是一種獨立的數據類型,而是一種特殊數值,它的數據類型依然屬於Number

        typeof NaN; //number

 

  isNaN方法可以用來判斷一個值是否為NaN,但是,isNaN只對數值有效,如果傳入其他值,會被先轉成數值。比如,傳入字符串的時候,字符串會被先轉成NaN,所以最后返回true,這一點要特別引起注意。也就是說,isNaNtrue的值,有可能不是NaN,而是一個字符串。

        isNaN('Hello') // true
        // 相當於
        isNaN(Number('Hello')) // true    

 

  判斷NaN更可靠的方法是,利用NaN是javascript之中唯一不等於自身的值這個特點,進行判斷

        function isNaN(value){
            return value != value;
        }

 

▓▓▓▓▓▓ 數制轉換

  有3個函數可以把非數值轉換成數值:Number()、parseInt()和parseFloat()。其中Number()可以將任意類型的值轉化成數值,而parseInt()和parseFloat()只應用於字符串向數字的轉換

  Number()

  轉換規則:

    1、如果是Boolean值,true和false將分別轉換為1和0

    2、如果是null值,返回0

    3、如果是undefined,返回NaN

    4、如果是字符串,遵循以下規則:

      (1)若字符串只包含十進制或十六進制數字,則轉成十進制的數字

        注意:Number()不識別八進制數字的字符串,會按照十進制數字處理

           字符串'1.2.'不會報錯,但數字1.2.會報錯

      (2)若字符串為空字符串或空格字符串,則轉成0

      (3)其他情況的字符串,則轉成NaN

        Number(true) //1
        Number(null) //0
        Number(undefined) //NaN
        Number("0123") //123
        Number("0x123") //291
        Number("0.2") //0.2
        Number("") //0
        Number("asd") //NaN
        

 

  parseInt()

  parseInt()專門用於把字符串轉換成整數。在轉換字符串時,會忽略字符串前面的空格,直到找到第一個非空格字符。如果第一個字符不是數字字符或者負號,parseInt()就會返回NaN。如果是,則繼續解析,直到解析完成或者遇到非數字字符

        console.log(parseInt('    123.8px'));//123
        console.log(parseInt('   123.8   '));//123
        console.log(parseInt(' -123.8px'));//-123
        console.log(parseInt('a123.8px'));//NaN
        console.log(parseInt('0 123.8px'));//0

 

  注意:在ECMAScript5中,parseInt()已經不具備解析八進制的能力。例如八進制“070”,會忽略前面的“0”,得到十進制的70

  為了消除在使用parseInt()函數時可能導致的上述困惑,可以為這個函數提供第二個參數:轉換時使用的基數(多少進制)

        parseInt("070") //70
        parseInt("070",8) //56

 

  parseFloat()

  parseFloat()專門用於字符串轉換浮點數。同樣地,解析時會忽略字符串前面的空格,直到找到第一個非空格字符,然后一直解析到字符串末尾或一個無效的浮點數字字符為止

        console.log(parseFloat('    0123.px'));//123
        console.log(parseFloat('    123.px'));//123
        console.log(parseFloat('    123.1px'));//123.1
        console.log(parseFloat('   123.1.2px   '));//123.1
        console.log(parseFloat(' -123.0px'));//-123
        console.log(parseFloat('.123.1px'));//0.123
        console.log(parseFloat('0 123px'));//0

 

  注意:parseFloat()只解析十進制,所以十六進制的字符串始終會被轉換成0。因此也沒有第二個參數用來指定基數

        parseFloat("0xA") //0

 

  注意:Number('')的結果是0,parseInt('')和parseFloat('')的結果是NaN

 

參考資料:

   阮一峰Javascript標准參考教程——基本語法之數值

   小火柴javascript類型系統——Number數字類型

  《javascript高級程序設計(第3版)》第3章 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM