相關文章
簡書原文:https://www.jianshu.com/p/9fb573ef10da
數據類型總結——概述:https://www.cnblogs.com/shcrk/p/9266015.html
數據類型總結——String(字符串類型):https://www.cnblogs.com/shcrk/p/9277107.html
數據類型總結——Number(數值類型):https://www.cnblogs.com/shcrk/p/9277040.html
數據類型總結——Boolean類型(布爾類型):https://www.cnblogs.com/shcrk/p/9265597.html
數據類型總結——null和undefined:https://www.cnblogs.com/shcrk/p/9266100.html
數據類型總結——基本包裝類型:https://www.cnblogs.com/shcrk/p/9266066.html
數據類型總結——Array(數組類型):https://www.cnblogs.com/shcrk/p/9276989.html
大綱
前言
1、Number(數值類型)的相關概念
2、Number相關的方法
3、數據類型轉換
4、關於NaN
前言
數據類型是每一種語言都需要掌握的內容,掌握每一種數據類型的使用是掌握這門語言必不可少的。而我也對數據類型寫了一系列的博客,其中包含了對某一數據類型的概念的認識和理解以及常使用的方法。以下就是我對Number類型的一些認識和理解,希望能對讀者有所幫助。並且這是關於ES6之前的一篇,之后還會有一篇關於ES6對數值類型的新增的知識的總結。
1、Number(數值類型)的相關概念
1、Number類型包括整數和浮點數。
2、數字字面量有十進制、八進制、十六進制
var num1 = 56; //十進制整數56 var num2 = 070; //八進制的56,前綴為0 var num2 = 079; //八進制56的錯誤表示,9超過了8,前面的0被忽略,解析成十進制,即:79 var num4 = 0x56; //十六進制的56,前綴為0x
3、在進行算術計算時,所有的八進制和十六進制的數值最終都將被轉換成十進制數值。
4、數值范圍。
//Number.MIN_VALUE:5e-324 //Number.MAX_VALUE:1.7976931348623157e+308 //如果超出了這個范圍,則是Infinity或者-Infinity即:Number.NEGATIVE_INFINITY //或者Number.POSITIVE_INFINITY //可以使用isFinite()函數來判斷是否是無窮,如果不是無窮則返回true console.log(isFinite(56));//true
2、Number相關的方法
2.1、toString()
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(16)); //十六進制:a console.log("三進制:"+num.toString(3)); //三進制:101
2.2、toFixed(num)
/* NumberObject.toFixed(num) 把number數轉換成一個十進制數形式的字符串。可選參數控制其小數點后的數字位數。 它的值必須在0~20之間,默認為0,例如: 可根據傳入的參數保留小數點后幾位 toFixed()方法是在JavaScript1.5和JScript5.5中加入的,因此僅被Netscape6+ 和IE5.5+瀏覽器支持 toFixed()在截取小數點后幾位數的時候會進行四舍五入。 */ var num = new Number(13.37); console.log(num.toFixed(1));//13.4
2.3、toExponential()
/* Number.toExponential(fractionDigits) 把number轉換成一個指數形式的字符串。可選參數控制其小數點后的數字位數。 它必須在0~20之間。 */ document.writeln(Math.PI.toExponential(0));//3e+0 document.writeln(Math.PI.toExponential(2));//3.14e+0 document.writeln(Math.PI.toExponential(7));//3.1415927e+0 document.writeln(Math.PI.toExponential(16));//3.1415926535897930e+0 document.writeln(Math.PI.toExponential( ));//3.141592653589793e+0
2.4、toPrecision()
/* number.toPrecision(precision) 返回固定大小格式(fixed),會根據傳入的數值分別用toFixed()或者toExponential()方 法返回指定位數的字符串表示(不包括指數部分) 把這個number轉化為一個十進制形式的字符串。可選參數控制字符精度, 它的精度必須在0~21之間。例如: */ document.writeln(Math.PI.toPrecision(2));//3.1 document.writeln(Math.PI.toPrecision(7));//3.141593 document.writeln(Math.PI.toPrecision(16));//3.141592653589793 document.writeln(Math.PI.toPrecision( ));//3.141592653589793
3、數據類型轉換
3.1、Number()
/* Number()函數的轉換規則如下: 如果是Boolean值,true和false將分別轉換成0和1 如果是數字,只是簡單的傳入和返回 如果是null,返回0 如果是undefined,返回NaN 如果是NaN,返回NaN 如果是字符串,則 如果字符串中只包含數字(包括前面帶正號或負號的情況),則將其裝換成對應的十進制數字 如果字符串中包含浮點格式的數字,轉換成對應的浮點數 如果字符串中包含十六進制0xf,則會轉換為相同大小的十進制數值即15 如果字符串 是空的(不包含任何字符),則將其轉換成0 如果字符串中包含除了上述格式之外的字符,則將其轉換為NaN 如果是對象,則調用對象的valueOf()方法,然后依照前面的規則返回的值,如果轉換 的結果是NaN,則調用對象的toString()方法,然后再按照前面的規則轉換返回的字符串的值 */ console.log(Number(true)); //1 console.log(Number(2)); //2 console.log(Number(null)); //0 console.log(Number(undefined)); //NaN console.log(Number(NaN)); //NaN console.log(Number('')); //0 console.log(Number(' ')); //0 console.log(Number('2')); //2 console.log(Number('02')); //2 console.log(Number('020')); //20 console.log(Number('0xf')); //15 console.log(Number('2a')); //NaN console.log(Number('a2')); //NaN console.log(Number('bule')); //NaN console.log(Number(null)); //0
3.1、parseInt()方法和parseFloat()
由於Number()函數在轉換字符串比較復雜而且不夠合理,因此常用parseInt()方法和parseFloat()方法來處理字符串和數值之間的轉換。parseInt()函數在轉換字符串的時候,更多看的是其是否符合數值模式,它會忽略字符串前面的空格,直至找到第一個非空格的字符。
/* 如果第一個字符不是數字字符或者符號,parseInt()就會返回NaN;也就是說, 用parseInt()轉換空字符串會返回NaN(Number()對空字符返回0)。 parseInt方法如果接收的字符串含有非數字的字符,那么parseInt方法會從字符串的首個 字符開始尋找,一直找到非數字字符為止,然后就把前面的數字字符轉換成數字 parseInt() 方法首先查看位置 0 處的字符,判斷它是否是個有效數字;如果不是,該方 法將返回 NaN,不再繼續執行其他操作。但如果該字符是有效數字,該方法將查看位置 1 處的 字符,進行同樣的測試。這一過程將持續到發現非有效數字的字符為止,此時 parseInt() 將 把該字符之前的字符串轉換成數字。 parseInt()也能解析各種整數格式,如十六進制、八進制等(但是ES5不具備了解析 八進制的能力了,因為ES5認為八進制是無效的) */ console.log(parseInt(1)); //1 console.log(parseInt('')); //NaN console.log(parseInt(' ')); //NaN console.log(parseInt('1')); //1 console.log(parseInt('a1')); //NaN console.log(parseInt('1a')); //1 console.log(parseInt('070')); //70 console.log(parseInt('70')); //70 console.log(parseInt('0xf')); //15(0x表示16進制) /* parseInt()提供了第二個參數,轉換是使用的基數(即多少進制)(基模式),如果要解析的 值是八進制的字符串,則指定基數8作為第二個參數,可以保證得到正確的結果。 不指定基數的情況下,意味着讓parseInt()決定如何解析輸入的字符串,因此為了避免錯誤 的解析,我們建議無論什么情況下都明確指定基數。 多數情況下,我們要解析的都是十進制數值,因此始終將10作為第二個參數是非常必要的。 */ console.log(parseInt('070')); //70 console.log(parseInt('070',8)); //56 console.log(parseInt('70')); //70
4、關於NaN
1、Number.NaN:NaN是一個特殊的數值,NaN即非數值(Not a Number),這個數值用於本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。
2、NaN本身有兩個非同尋常的特點。
首先,任何涉及NaN的操作,如NaN/10都會返回NaN,這個特點在多步計算中有可能會導致問題,但是同樣也解決了如果出現任何數值/0會拋出錯誤,停止代碼執行這樣的情況。其次,NaN與任何值都不相等,包括NaN本身。
3、可以通過isNaN()方法來判斷某個數值是否是NaN這個特殊的數。
使用isNaN()方法會將傳入的數值如果是非數值的會將其自動轉換成數值類型,若能轉換成數值類型,那么這個函數返回false,若不能轉換成數值類型,則這個數就是NaN,即返回true。
4、isNaN()方法確實適用於對象,在基於對象的調用時,會首先調用對象的valueOf()方法,然后確定該返回的數值能否轉換成數值,如果不能,則基於這個返回值再調用toString()方法,再測試返回值。而這個過程也是ECMAScript中內置的函數和操作符的一般執行流程。