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()轉換規則
- 如果是布爾值,
true
和false
會被轉換為1
和0
。
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",則將其轉換為對應的浮點數值。
- 字符串中包含有效的十六進制格式(一般用數字
0
到9
和字母A
到F
(或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
總結:
為什么Number
和parseInt/parseFloat
計算結果不一樣呢?
-
Number
轉換規則是瀏覽器底層渲染規則,是瀏覽器的一個非常重要的方法,parseInt/parseFloat
是一個單獨方法的規則,就是用來處理字符串的。 -
Number
走的是最底層的機制,遇到其他類型,底層機制會告訴我們哪個類型跟哪個類型應該怎么轉換,這是底層機制已經規定好的,比如遇到布爾值,true
轉為1
,false
轉為0
parseInt
和parseFloat
是額外提供的方法,就是瀏覽器提供的方法,它們的源碼處理機制很簡單,會先把傳入的參數轉換為字符串,然后在從左到右查找數字有效字符。