在JavaScript中判斷整型的N種方法示例介紹
整數(shù)類型(Integer)在JavaScript經(jīng)常會導(dǎo)致一些奇怪的問題。在ECMAScript的規(guī)范中,他們只存在于概念中:
所有的數(shù)字都是浮點(diǎn)數(shù),并且整數(shù)只是沒有一組沒有小數(shù)的數(shù)字。
在這篇博客中,我會解釋如何去檢查某個值是否為整型。
ECMAScript 5
在ES5中有很多方法你可以使用。有時侯,你可能想用自己的方法:一個isInteger(x)的函數(shù),如果是整型返回true,否則返回false.
讓我們看看一些例子。
通過余數(shù)檢查
你可以使用余數(shù)運(yùn)算(%),將一個數(shù)字按1求余,看看余數(shù)是不是0。
function isInteger(x) {
return x % 1 === 0;
}
我喜歡這個方法,因?yàn)樗浅:唵?,而且有效?/p>
> isInteger(17) true > isInteger(17.13) false
在操作余數(shù)運(yùn)算時你得小心一點(diǎn),因?yàn)榻Y(jié)果取決于第一個數(shù)的符號,如果是正的,結(jié)果就是正的;否則就是負(fù)的。
> 3.5 % 1 0.5 > -3.5 % 1 -0.5
然后,我們也可以檢查0,這其實(shí)不是一個問題。但問題是:這個方法對非數(shù)字也會返回true,因?yàn)?% 會將它轉(zhuǎn)換成數(shù)字:
> isInteger('')
true
> isInteger('33')
true
> isInteger(false)
true
> isInteger(true)
true
可以通過很簡單的類型檢查來解決:
function isInteger(x) {
return (typeof x === 'number') && (x % 1 === 0);
}
通過Math.round() 如果一個數(shù)字取整以后還跟之前的值一樣,那么它就是整數(shù)。在JavaScript中可以通過Math.round()來檢查:
function isInteger(x) {
return Math.round(x) === x;
}
這個方法也不錯
> isInteger(17) true > isInteger(17.13) false
它也可以判斷非數(shù)字,因?yàn)镸ath.round()總是返回?cái)?shù)字,并且===只有當(dāng)類型一樣時才返回true.
> isInteger('')
false
如果你想讓代碼更清晰一點(diǎn),你可以添加類型檢查(就是我們在之前版本做的)。另外,Math.floor()和Math.ceil()可以像Math.round()一樣工作。 通過位操作檢查 位操作符提供另外一種“取整”的方法:
function isInteger(x) {
return (x | 0) === x;
}
這個解決方案(跟其它位運(yùn)算一樣)有一個缺陷:它無法處理超過32位的數(shù)字。
> isInteger(Math.pow(2, 32)) false
通過parseInt()檢查 parseInt()也提供了跟Math.round()類似將數(shù)字轉(zhuǎn)換成整型的方法。 讓我們看看這個方法為什么不錯。
function isInteger(x) {
return parseInt(x, 10) === x;
}
像Math.round()解決方案一樣,它也可以處理非數(shù)字的情況,但是它也不能正確地處理所有的整型數(shù)字:
> isInteger(1000000000000000000000) false
為什么?parseInt()在解析整數(shù)之前強(qiáng)迫將第一個參數(shù)解析成字符串。因此使用這種方法將數(shù)字轉(zhuǎn)換成整型不是一個好的選擇。
> parseInt(1000000000000000000000, 10) 1 > String(1000000000000000000000) '1e+21'
就像上面那樣,parseInt()在解析'1e+21'時在1處停止處理了,所以它才會返回1. ECMAScript 6 對于Math.round()扔補(bǔ)充,ES6提供了另外一個將數(shù)字轉(zhuǎn)換成整型的方法:Math.trunc()。該函數(shù)會移除數(shù)字的小數(shù)部分。
> Math.trunc(4.1) 4 > Math.trunc(4.9) 4 > Math.trunc(-4.1) -4 > Math.trunc(-4.9) -4
此外,ECMAScript6不需要去處理檢查整數(shù)那些瑣碎的任務(wù),因?yàn)樗鼛в幸粋€內(nèi)置函數(shù) Number.isInteger()。
相關(guān)文章
js實(shí)現(xiàn)(全選)多選按鈕的方法【附實(shí)例】
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)(全選)多選按鈕的方法【附實(shí)例】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-03-03
JS實(shí)現(xiàn)鼠標(biāo)單擊與雙擊事件共存
本篇文章主要是對JS實(shí)現(xiàn)鼠標(biāo)單擊與雙擊事件共存的簡單實(shí)例進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03
JS動態(tài)修改網(wǎng)頁body的背景色實(shí)例代碼
這篇文章主要介紹了JS動態(tài)修改網(wǎng)頁body的背景色實(shí)例代碼 ,需要的朋友可以參考下2017-10-10
javascript中的document.open()方法使用介紹
document.open()方法打開一個新的文檔并用document.write()方法編寫文檔的內(nèi)容,下面有個不錯的示例,大家可以感受下2013-10-10
layui 表格操作列按鈕動態(tài)顯示的實(shí)現(xiàn)方法
今天小編就為大家分享一篇layui 表格操作列按鈕動態(tài)顯示的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09

