javascript
javascript 判断为负数_JavaScript从零开始——标准库(7)
今天的重點,是數值(Number)對象。
1 概念
Number對象是數值對應的包裝對象,可以作為構造函數使用,也可以作為工具函數使用。
作為構造函數時,它用于生成值為數值的對象:
上面代碼中,Number對象作為構造函數使用,返回一個值為1的對象。
作為工具函數時,它可以將任何類型的值轉為數值:
上面代碼將布爾值false轉為數值0。
2 靜態屬性
Number對象擁有以下一些靜態屬性(即直接定義在Number對象上的屬性,而不是定義在實例上的屬性)。
- Number.POSITIVE_INFINITY:正的無限,指向Infinity。
- Number.NEGATIVE_INFINITY:負的無限,指向-Infinity。
- Number.NaN:表示非數值,指向NaN。
- Number.MIN_VALUE:表示最小的正數(即最接近0的正數,在64位浮點數體系中為5e-324),相應的,最接近0的負數為-Number.MIN_VALUE。
- Number.MAX_SAFE_INTEGER:表示能夠精確表示的最大整數,即9007199254740991。
- Number.MIN_SAFE_INTEGER:表示能夠精確表示的最小整數,即-9007199254740991。
ES 6 在Number對象上面,新增一個極小的常量Number.EPSILON。根據規格,它表示 1 與大于 1 的最小浮點數之間的差。
對于 64 位浮點數來說,大于 1 的最小浮點數相當于二進制的1.00..001,小數點后面有連續 51 個零。這個值減去 1 之后,就等于 2 的 -52 次方。
Number.EPSILON實際上是 JavaScript 能夠表示的最小精度。誤差如果小于這個值,就可以認為已經沒有意義了,即不存在誤差了。
引入一個這么小的量的目的,在于為浮點數計算,設置一個誤差范圍。我們知道浮點數計算是不精確的:
上面代碼解釋了,為什么比較0.1 + 0.2與0.3得到的結果是false。
Number.EPSILON可以用來設置“能夠接受的誤差范圍”。比如,誤差范圍設為 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個浮點數的差小于這個值,我們就認為這兩個浮點數相等:
因此,Number.EPSILON的實質是一個可以接受的最小誤差范圍:
上面的代碼為浮點數運算,部署了一個誤差檢查函數。
3 實例方法
在ES 5時代,Number對象有5個實例方法,都跟將數值轉換成指定格式有關;在ES 6標準發布之后,又增補了幾種方法,下面一一介紹到。
3.1 Number.prototype.toString()
Number對象部署了自己的toString方法,用來將一個數值轉為字符串形式:
toString方法可以接受一個參數,表示輸出的進制。如果省略這個參數,默認將數值先轉為十進制,再輸出字符串;否則,就根據參數指定的進制,將一個數字轉化成某個進制的字符串:
上面代碼中,345一定要放在括號里,這樣表明后面的點表示調用對象屬性。如果不加括號,這個點會被 JavaScript 引擎解釋成小數點,從而報錯:
只要能夠讓 JavaScript 引擎不混淆小數點和對象的點運算符,各種寫法都能用。除了為345加上括號,還可以在345后面加兩個點,JavaScript 會把第一個點理解成小數點(即345.0),把第二個點理解成調用對象屬性,從而得到正確結果;同理,空格加上一個點,或者正數變為小數都是可以的:
這實際上意味著,可以直接對一個小數使用toString方法:
通過方括號運算符也可以調用toString方法:
toString方法只能將十進制的數,轉為其他進制的字符串。如果要將其他進制的數,轉回十進制,需要使用parseInt方法。
3.2 Number.prototype.toFixed()
toFixed()方法先將一個數轉為指定位數的小數,然后返回這個小數對應的字符串:
上面代碼中,345和345.008先轉成2位小數,然后轉成字符串。其中345必須放在括號里,否則后面的點會被處理成小數點。
toFixed()方法的參數為小數位數,有效范圍為0到100,超出這個范圍將拋出 RangeError 錯誤。
由于浮點數的原因,小數5的四舍五入是不確定的,使用的時候必須小心:
3.3 Number.prototype.toExponential()
toExponential方法用于將一個數轉為科學計數法形式:
toExponential方法的參數是小數點后有效數字的位數,范圍為0到100,超出這個范圍,會拋出一個 RangeError 錯誤。
3.4 Number.prototype.toPrecision()
Number.prototype.toPrecision()方法用于將一個數轉為指定位數的有效數字:
該方法的參數為有效數字的位數,范圍是1到100,超出這個范圍會拋出 RangeError 錯誤。
該方法用于四舍五入時不太可靠,跟浮點數不是精確儲存有關:
3.5 Number.prototype.toLocaleString()
Number.prototype.toLocaleString()方法接受一個地區碼作為參數,返回一個字符串,表示當前數字在該地區的當地書寫形式:
該方法還可以接受第二個參數配置對象,用來定制指定用途的返回字符串。該對象的style屬性指定輸出樣式,默認值是decimal,表示輸出十進制形式。如果值為percent,表示輸出百分數:
如果style屬性的值為currency,則可以搭配currency屬性,輸出指定格式的貨幣字符串形式:
如果Number.prototype.toLocaleString()省略了參數,則由瀏覽器自行決定如何處理,通常會使用操作系統的地區設定。注意,該方法如果使用瀏覽器不認識的地區碼,會拋出一個錯誤:
3.6 Number.isFinite(), Number.isNaN()
ES 6 在Number對象上,新提供了Number.isFinite()和Number.isNaN()兩個方法。
Number.isFinite()用來檢查一個數值是否為有限的(finite),即不是Infinity。
注意,如果參數類型不是數值,Number.isFinite一律返回false。
Number.isNaN()用來檢查一個值是否為NaN:
如果參數類型不是NaN,Number.isNaN一律返回false。
它們與傳統的全局方法isFinite()和isNaN()的區別在于,傳統方法先調用Number()將非數值的值轉為數值,再進行判斷,而這兩個新方法只對數值有效,Number.isFinite()對于非數值一律返回false, Number.isNaN()只有對于NaN才返回true,非NaN一律返回false。
3.7 Number.parseInt(), Number.parseFloat()
ES 6 將全局方法parseInt()和parseFloat(),移植到Number對象上面,行為完全保持不變:
這樣做的目的,是逐步減少全局性方法,使得語言逐步模塊化:
3.8 Number.isInteger()
Number.isInteger()用來判斷一個數值是否為整數:
JavaScript 內部,整數和浮點數采用的是同樣的儲存方法,所以 345 和 345.0 被視為同一個值:
如果參數不是數值,Number.isInteger返回false:
注意,由于 JavaScript 采用 IEEE 754 標準,數值存儲為64位雙精度格式,數值精度最多可以達到 53 個二進制位(1 個隱藏位與 52 個有效位)。如果數值的精度超過這個限度,第54位及后面的位就會被丟棄,這種情況下,Number.isInteger可能會誤判:
上面代碼中,Number.isInteger的參數明明不是整數,但是會返回true。原因就是這個小數的精度達到了小數點后16個十進制位,轉成二進制位超過了53個二進制位,導致最后的那個3被丟棄了。
類似的情況還有,如果一個數值的絕對值小于Number.MIN_VALUE(5E-324),即小于 JavaScript 能夠分辨的最小值,會被自動轉為 0。這時,Number.isInteger也會誤判:
上面代碼中,5E-325由于值太小,會被自動轉為0,因此返回true。
總之,如果對數據精度的要求較高,不建議使用Number.isInteger()判斷一個數值是否為整數。
3.9 安全整數和 Number.isSafeInteger()
JavaScript 能夠準確表示的整數范圍在-2^53到2^53之間(不含兩個端點),超過這個范圍,無法精確表示這個值:
上面代碼中,超出 2 的 53 次方之后,一個數就不精確了。
Number.isSafeInteger()則是用來判斷一個整數是否落在這個范圍之內:
這個函數的實現很簡單,就是跟安全整數的兩個邊界值比較一下。
Number.isSafeInteger = function (n) {return (typeof n === 'number' &&Math.round(n) === n &&Number.MIN_SAFE_INTEGER <= n &&n <= Number.MAX_SAFE_INTEGER); }實際使用這個函數時,需要注意。驗證運算結果是否落在安全整數的范圍內,不要只驗證運算結果,而要同時驗證參與運算的每個值:
上面代碼中,9007199254740993不是一個安全整數,但是Number.isSafeInteger會返回結果,顯示計算結果是安全的。這是因為,這個數超出了精度范圍,導致在計算機內部,以9007199254740992的形式儲存:
所以,如果只驗證運算結果是否為安全整數,很可能得到錯誤結果。下面的函數可以同時驗證兩個運算數和運算結果:
4 自定義方法
與其他對象一樣,Number.prototype對象上面可以自定義方法,被Number的實例繼承:
上面代碼為Number對象實例定義了一個add方法。在數值上調用某個方法,數值會自動轉為Number的實例對象,所以就可以調用add方法了。由于add方法返回的還是數值,所以可以鏈式運算:
上面代碼在Number對象的實例上部署了subtract方法,它可以與add方法鏈式調用。
我們還可以部署更復雜的方法:
上面代碼在Number對象的原型上部署了iterate方法,將一個數值自動遍歷為一個數組。
注意,數值的自定義方法,只能定義在它的原型對象Number.prototype上面,數值本身是無法自定義屬性的:
上面代碼中,n是一個原始類型的數值。直接在它上面新增一個屬性x,不會報錯,但毫無作用,總是返回undefined。這是因為一旦被調用屬性,n就自動轉為Number的實例對象,調用結束后,該對象自動銷毀。所以,下一次調用n的屬性時,實際取到的是另一個對象,屬性x當然就讀不出來。
總結
以上是生活随笔為你收集整理的javascript 判断为负数_JavaScript从零开始——标准库(7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定义跳转插件_虚幻插件Review:Lo
- 下一篇: abap mm后台表_【中后台应用】从表