JavaScript基本概念之數據類型Number

Number 類型

Number類型應該是ECMAScript中最令人關注的數據類型了,這種類型使用IEEE754格式來表示整數和浮點數字(浮點數字在某些語言中也被稱為雙精度數值)。為支持各種數值類型,ECMA-262 定義了不同的數值字面量格式。

var intNum = 55; //十進制 整數

八進制字面值第一位必須是(0),然后是(0~7)

var octalNum1= 070;    //八進制 56
var octalNum2 = 079;   //無效八進制, 解析為79
var octalNum3 = 08;    //無效八進制, 解析為8

八進制在嚴格模式下是無效的,會導致支持該模式的JavaScript引擎拋出錯誤。

十六進制字面值前兩位必須是0x,后跟(09,AF/a~f)。

var hexNum1 = 0xA;    //十六進制 10
var hexNum2 = 0x1f;   //十六進制 31

在進行算術計算時,所有八進制和十六進制表示的數值最終都將被轉換成十進制數值。

  • 1.浮點數值
    所謂浮點數值,就是該數值中必需包含一個小數點,且小數點后面必需至少有一位數字。
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;

由于保存浮點數值需要的內存空間是保存整數的兩倍,因此ECMAScript會不失時機的將浮點數值轉換為整數值。如:

var floatNum1 = 1.;    //小數點后面沒有數字,解析為1
var floatNum2 = 10.0;  //整數,解析為10

對于那些極大或極小的數組,可以用e表示法。

var floatNum = 3.125e7;   //等于31250000

默認情況下,ECMAScript會將那些小數點后面帶有6個零以上的浮點數值轉換為以e表示法表示的數值。(0.0000003會被轉會成3e-7)

浮點數值計算會產生舍入誤差問題。

  • 2.數值范圍
    ECMAScript能夠表示的最小數值保存在 Number.MIN_VALUE中——在大多數瀏覽器中,這個值是5e-324;能夠保存最大的數值保存在Number_MAX_VALUE中——在大多數瀏覽器中,這個值是1.7976931348623157e+308。如果某次計算結果超出JavaScript數值范圍的值,那么這個數將被自動轉換層特殊的(+/-)Infinity值。
    要想確定一個數值是不是有窮的(是不是位于最大值和最小值之間),可以使用isFinite()函數。這個函數在參數位于最小與最大數之間是會返回true,否則返回false
var result = Number.MAX_VALUE + Number.MIN_VALUE;
alert(isFinite(result));   //false

訪問Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY也可以得到負和正Infinity得值。可想二見,這兩個屬性中分別保存這-InfinityInfinity.。

  • 3. NaN
    NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用于表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。例如,在其他編程語言中,任何數值除以非數值都會導致錯誤,從而停止代碼執行。但在ECMAScript中,任何數值除以非數值會返回NaN,因此不會影響其他代碼的執行。
    NaN本身有兩個非同尋常的特點。首先,任何涉及NaN的操作(例如NaN/10)都會返回NaN,這個特定在多步計算中有可能導致問題。其次,NaN與任何值都不相等,包括NaN本身。例如:
alert(NaN === NaN); //false

針對NaN的這兩個特定,ECMAScript定義了isNaN()函數。這個函數接受一個參數,該參數可以是 任何類型,而函數會幫我們確定這個參數是否“不是數值”。isNaN()在接收到一個值之后,會嘗試將這個值轉換為數值。某些不是數值的值會直接轉換為數值,例如字符串"10"Boolean值。而任何不能被轉換為數值的值都會導致這個函數返回true

alert(isNaN(NaN));       //true
alert(isNaN(10));         //false
alert(isNaN("10"));        //false
alert(isNaN("blue"));       //true
alert(isNaN(true));          //false

isNaN()也適用于對象。在基于對象調用isNaN()函數式,會首先調用對象的valueOf()方法,然后確定該方法放回的值是否可以轉換為數值。如果不能,則基于這個返回值再調用toString()方法,再測試返回值。

  • 4. 數值轉換
    有3個函數可以 把非數值轉換為數值:

Number()
parseInt()
parseFloat()

轉型函數Number()可以用于任何數據類型,另外兩個函數則專門用于把字符串轉換成數值。這3個函數對于同樣的輸入會有不同的返回結果。

Number()函數的轉換規則如下:

  • 如果是Boolean值,truefalse將分別被轉換為1和0。
  • 如果是數字值,只是簡單的傳入和返回。
  • 如果是null值,返回0。
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循下列規則:
  • 如果字符串只包含數字(包括前面帶正好和負號的情況),則將其轉換為十進制數值,即"1"會變成1,而"011"會變成11(前導零被忽略);
  • 如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
  • 如果字符串包含有效的十六進制格式,例如"0xf",則將其轉換為相同大小的十進制整數值;
  • 如果字符串是空的(不包含任何字符),則將其轉換為0;
  • 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN
  • 如果是對象,則調用對象的valueOf()方法,然后依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然后再一次依照前面的規則轉換返回的字符串值。
var num1 = Number("Hello world!");     //NaN
var num2 = Number(" ");                //0
var num3 = Number("00000011");         //11
var num4 = Number(true);               //1

由于Number()函數在轉換字符串時比較復雜而且不夠合理,因此在處理整數的時候更常用的是parseInt()函數。parseInt()函數在轉換字符串時,更多的是看其是否符合數值模式。他會忽略字符串前面的空格,直至找到第一個非空格字符。如果第一個字符不是數字字符或這負號,parseInt()就會返回NaN;也就是說,用parseInt()轉換空字符串會返回NaNNumber()對空字符串返回0)。如果第一個字符是數字字符,parseInt()會繼續解析,知道解析完所有后續字符或者遇到了一個非數字字符。例如"1234blue"會被轉換為1234,"22.5"會被轉換為22,因為小數點不是有效的數字字符。
parseInt()也能夠識別出各種整數格式(十進制,八進制,十六進制)。

var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(" "); //NaN
var num3 = parseInt("0xA"); //10(十六進制)
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56(八進制)
var num6 = parseInt("70"); //70(十進制)
var num7 = parseInt("0xf"); //15(十六進制)

ECMAScript 3中的parseInt()可以解析八進制,但在ECMAScript 5中parseInt()不具有解析八進制的能力(parseInt(070)//70)。
為消除在使用parseInt()函數時可能導致的困惑,可以為這個函數提供第二個參數:轉換時使用的基數(即多少進制)。

var num = parseInt("0xAF",16); //175
var num1 = parseInt("AF",16); //175
var num2 = parseInt("AF"); //NaN
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()parseInt()類似,但只能解析十進制值,如果字符串包含的一個可解析為整數的數,parseFload()會返回整數。

var num1 = parseFloat("1234blue"); //1234
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ECMAScript中有5種簡單數據類型(也稱為基本數據類型):Undefined 、Null、 Boolean ...
    胖胖冰閱讀 247評論 0 0
  • 什么是 JavaScript 語言? JavaScript 是一種輕量級的腳本語言。所謂“腳本語言”(script...
    oWSQo閱讀 1,826評論 0 1
  • 變量 聲明變量 命名變量區分大小寫的語言第一個字符是字母或下劃線_,數字不能作為第一個字符字符必須是字母,數字或者...
    flyingtoparis閱讀 834評論 0 0
  • 記得正在全棧營奮戰代碼的時候,教程里上傳了李笑來老師的開學典禮演講,我印象中最深的一句話是:“你們是不是覺得代碼最...
    xulingxian閱讀 652評論 0 0
  • 忽如一夜春風來,千樹萬樹梨花開。 清晨推開窗,清新的空氣中透著淡淡的幽香,走到院子里,看到那滿山遍野的白。 梨花開...
    青葉11閱讀 410評論 0 0