前言
本文將詳細又簡練的帶你把基本數據類型之一的number進行講解,有不對之處歡迎指正
正文
number類型可以是十進制,八進制,十六進制,八進制第一位必須是0,然后是八進制數字序列(0-7),如果字面中的數值超出了范圍,前導0會被忽略,后面的數字會被當做十進制解析。十六進制的前兩位是以0x開頭,后面跟十六進制數字(0-9以及A-F)
1.浮點數值
浮點數值就是我們平時說的小數,在js中,1.1,0.1,.1都是允許的,但是.1不推薦(會解析為0.1),在內存中浮點數所占用的內存是整數的兩倍,所以解析器會把1.或者1.0這樣的數解析為1整數。浮點數的最高精確位數是17位。
2.數值范圍
由於內存的限制,number有最大值和最小值,其中最大值保存在Number.MAX_VALUE中,最小值保存在Number.MIN_VALUE中。
3.NaN(重點)
NaN即非數值,這個數值表示一個本來要返回數值的操作數未返回數值的情況,就比如用一個數字去除以一個字符串就會返回NaN。
①任何涉及NaN的操作都會返回NaN,但是用typeof檢測NaN的類型是返回number,因為他本身就是特殊的number類型嘛
②NaN與NaN不相等,其實還是第一條
還有一個isNaN()函數,用來檢測接受的參數是否是非數字,isNaN還可以用來檢測對象,當檢測對象時首先會調用對象的valueOf()方法,確定是否可以轉換為數值,如果不能,就基於這個返回值調用toString()方法,在測試返回值。
4.數值轉換(重點)
可以使用三個函數把非數值轉換為數值,分別是Number()、parseInt()、parseFloat()。
①Number()
Number()可以轉換任何數據類型,記住這里指的是任何數據類型,既包括基本數據類型也包括引用類型,對應的轉換規則如下:
- boolean類型,true轉換為1,false轉換為0
- number類型,輸入什么輸出什么,NaN類型還是NaN
- null類型,轉換為0
- UNdefined類型,返回NaN
- 如果是字符串:
- 只包含數字,十進制,如'123',轉換為123,八進制的前導零會被忽略轉換為十進制,例如'055',轉換為55
- 如果是有效的小數,轉換為相應的小數,前導零還是會被忽略
- 如果是十六進制,轉換為對應的十進制
- 字符串為一個空字符串轉換為0
- 字符串是其他格式全部轉換為NaN,例如'asbdy123','12458adbej'
- 如果是對象,類似於isNaN()參數為對象的情況,首先調用對象的valueOf()方法,根據返回值按照前面的規則進行轉換,如果結果是NaN則調用對象的toString()方法,注意與isNaN不同的是這次調用的不是valueOf()的返回值了
②parseInt()
這個方法專門用於把字符串轉換成數值,無法轉換對象
parseInt()會忽略字符串前面的空格,直到找到第一個非空字符
- 'abc123'會被轉換成NaN
- ' 123.14.15abc'會被轉換為 123
- ' '轉換為NaN
另外,parseInt()在處理八進制時存在分歧ES3會正確解析八進制而ES5會忽略前導零,因此這個方法還接受第二個參數,轉換時使用的基數(即多少進制)
var num1 = parseInt('af',16); // 175
var num2 = parseInt('af'); // NaN
var num3 = parseInt('010',8); //8
③parseFloat()
這個方法用來解析字符串格式的浮點數
這個方法也是從第一個字符開始解析,而且也會忽略最開始的空格,直至解析到一個非空字符,方法會一直解析到字符串末尾。或者解析到遇見一個無效的浮點數字字符為止,就是說第一個小數點有效,后面的小數點就是無效的。
parseFloat()始終會忽略前導零而且不能傳第二個參數即使用什么進制,所以十六進制始終會轉換成0,因為是0x開頭,所以這個方法只用來解析十進制。
5.基本包裝數據類型Number
這里我們補充一下基本包裝數據類型Number(是一個對象,已經不是基本數據類型),詳細對基本包裝數據類型對象的介紹可以查看我的另一篇博文https://www.cnblogs.com/jojo-star/p/13446501.html
Number是與數字值對應的引用類型。要創建Number對象,可以在調用Number構造函數時向其中傳遞相應的數值。與Boolean類型一樣,Number類型也重寫了valueOf()、toLocaleString()和toString()方法。重寫后的valueOf()方法返回對象表示的基本類型的數值,另外兩個方法則返回字符串形式的數值。雖然重寫了但是與之前的用法並無什么區別,可以為toString()方法傳遞一個表示基數的參數,告訴它返回幾進制數值的字符串形式,如下面的例子所示。
var num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // 二進制表示的字符串"1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"
除了繼承的方法之外,Number類型還提供了一些用於將數值格式化為字符串的方法。
①toFixed(),會按照指定的小數位返回數值的字符串表示(最大20位),如果數值本身包含的小數位比指定的還多,那么接近指定的最大小數位的值就會舍入(不同瀏覽器會有不同,對於四舍五入)
var num = 10;
console.log(num.toFixed(2)); // "10.00"
var num1 = 10.005
console.log(num1.toFixed(2)); // '10.01',小於小數位數,就會四舍五入
②toExponential(),該方法返回以指數表示法(也稱e表示法)表示的數值的字符串形式。與toFixed()一樣,toExponential()也接收一個參數,而且該參數同樣也是指定輸出結果中的小數位數
var num = 10;
console.log(num.toExponential(2)); // "1.00e+1" ,十這個數值很小其實是沒有必要使用指數表示的
var num1 = 1005.12345
console.log(num1.toExponential(2)); // '1.01e+3'
③toPrecision()方法,如果你想得到表示某個數值的最合適的格式,就應該使用toPrecision()方法。
對於一個數值來說,toPrecision()方法可能會返回固定大小(fixed)格式,也可能返回指數(exponential)格式;具體規則是看哪種格式最合適。這個方法接收一個參數,即表示數值的所有數字的位數(不包括指數部分)