JS中的Number數據類型詳解


Number數據類型

Number類型使用IEEE754格式來表示整數和浮點值,這也是0.2 + 0.3不等於0.5的原因,

最基本的數值類型字面量格式是十進制整數

var a = 10;

1. 浮點數值

整理中。。。

2. NaN

Not a Number:不是一個數,但它屬於數值類型

NaN的特點

  • NaN和任何值進行操作都會返回NaN
  • NaN與任何值都不相等,包括NaN本身
console.log(NaN == NaN)

3. isNaN函數

用於檢測一個變量不是數值(Number)類型。isNaN()接收一個參數,這個參數可以是任何類型。這個函數會嘗試把傳入的參數轉換為數值,某些不是數值的值會直接轉換成數值,例如字符串"10"Boolean值,不能轉換為數值的值返回true,能轉換的返回false

console.log( isNaN(NaN ) // true 
console.log( isNaN(10 ) // false
console.log( isNaN('10') // false
console.log( isNaN('blue') // true
console.log(isNaN( true )) // false (true會被轉換成1)

總結:

  • isNaN意思是:是不是非數值,是的話返回true,所有能被該函數轉換能Number類型的值,都返回false
  • 在使用isNaN進行檢測的時候,首先會驗證檢測的值是否為數字類型,如果不是,先基於Number()這個方法,把值轉換成數字類型,然后再檢測。
  • 空字符串、空數組、布爾值、null會轉成數值,所以isNaN函數返回false
  • 空對象、函數、undefined不能轉換成數值,返回true

4. 數值轉換

把非數值值轉換為數值:

  • Number()
  • parseInt() 取整
  • parseFloat() 浮點數

`Number()轉換規則

  • 如果是布爾值,truefalse會被轉換為10
Number(true) // 1
Number(false) // 0
  • 如果是數字,只是簡單的傳入和返回。
Number(1) // 1
Number(100) // 100
  • 如果是null值,返回0
Number(null) // 0

  • 如果是undefined,返回NaN
Number(undefined) // NaN

  • 如果是字符串:
    • 字符串中只包含數字(包括前面帶正/負號的情況),則將其轉換為十進制數值,數字前面有0的會被忽略(不管前面有幾個0,全部忽略),例如"010"會轉換成10
    • 字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數值。
    • 字符串中包含有效的十六進制格式(一般用數字09和字母AF(或a~f)表示,其中:A~F表示10~15,這些稱作十六進制數字),如"0xf",將其轉換成相同大小的十進制整數值。
    • 字符串為空,轉換成0
    • 字符串中包含除了以上格式之外的字符,則轉換為NaN,如字符串中既有數字又有字母的情況。

// 規則一
Number("1") // 1
Number("123") // 123
Number("010") // 10 (前導的0會被忽略)
Number("-10") // -10

// 規則2
Number("1.1") // 1.1
Number("0.1") // 0.1
Number("0000.1") // 0.1 (前導的0會被忽略)

// 規則3
Number(0xf) // 15

// 規則4
Number("") // 0
Number(" ") // 0
Number('') // 0

// 規則5
Number("Hello Wolrd") // NaN
Number("0ff6600") // NaN
Number("ff6600") // NaN
Number("0.1a") // NaN
Number("10a") // NaN
Number("a10.1") // NaN

var goodsList = {
    'pop':
}

var arr = [1,2,3,4]
Number(arr)
  • 如果對象,調用對象的valueOf(),空數組返回0,空對象返回NaN。

parseInt(string,radix)

將一個字符串轉換成x進制的整數。

傳入的第一個參數為字符串,如果參數不是字符串,則將其轉換為字符串(使用 ToString 抽象操作)。字符串開頭的空白符將會被忽略。

第二個參數為整數,表示按照xx進制轉換,如傳入參數10表示按十進制規則轉換,

從左到右依次查找有效數字字符,直到遇到非有效數字字符,停止查找(不管后面是否好友數字),把找到的當做數字返回。

如果字符串中以0x開頭且后跟數字字符,就會將其當做一個十六進制整數。

如果字符串以"0"開頭且后跟數字字符,則會被當做一個八進制數來解析。

如果不傳第二個參數,會按照八進制解析。在大多數情況下,我們要解析的都是十進制數值,因此始終將10作為第二個參數是非常必要的。

parseInt("123abc") // 123
parseInt("") // NaN
parseInt("12.5px") // 12
parseInt("0xA") // 10 (16進制)
parseInt("0xf") // 15 (16進制)
parseInt("070") // 70
parseInt("70") // 70

parseFloat(string)

解析一個參數(必要時先轉換為字符串)並返回一個浮點數。默認解析十進制值。

function circumference(r) {
  return parseFloat(r) * 2.0 * Math.PI;
}

console.log(circumference(4.567));
// expected output: 28.695307297889173

console.log(circumference('4.567abcdefgh'));
// expected output: 28.695307297889173

  • 從左到右依次解析字符,一直解析到字符串末尾,遇到非數字字符會或遇到第二個浮點數(在這之前的字符串都會被解析)會使解析停止,如"3.14"解析成3.14"3.14.1234"解析成3.14

  • 忽略參數首尾空白符


parseFloat("3.14") // 3.14
parseFloat("-3.14") //-3.14
parseFloat("+3.14") //3.14
parseFloat("0003.14") // 3.14
parseFloat(" 3.14 ") // 3.14
parseFloat("3.14abc") // 3.14
parseFloat("3.14.5678") // 3.14
parseFloat("abc3.14") // NaN
parseFloat("abc123") // NaN
parseFloat("123abc") // 123


總結:

為什么NumberparseInt/parseFloat計算結果不一樣呢?

  • Number轉換規則是瀏覽器底層渲染規則,是瀏覽器的一個非常重要的方法,parseInt/parseFloat是一個單獨方法的規則,就是用來處理字符串的。

  • Number走的是最底層的機制,遇到其他類型,底層機制會告訴我們哪個類型跟哪個類型應該怎么轉換,這是底層機制已經規定好的,比如遇到布爾值,true轉為1false轉為0
    parseIntparseFloat是額外提供的方法,就是瀏覽器提供的方法,它們的源碼處理機制很簡單,會先把傳入的參數轉換為字符串,然后在從左到右查找數字有效字符。


免責聲明!

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



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