本文大量參考阮一峰老師的ES6手冊。
本文只整理最常用的擴展。
Number.isFinite()、Number.isNaN()
ES6對數值的主要擴展就是把原本是window
的方法交給了Number
。
isFinite()
和isNaN()
原本是window
的方法,現在Number
也有這2個方法。
Number.isFinite()用來檢查一個數值是否為有限的(finite)。
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false
Number.isNaN()用來檢查一個值是否為NaN。
Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('15') // false
Number.isNaN(true) // false
Number.isNaN(9/NaN) // true
Number.isNaN('true'/0) // true
Number.isNaN('true'/'true') // true
它們跟window的方法的區別是:
傳統方法先調用Number()將非數值的值轉為數值,再進行判斷。
這兩個新方法只對數值有效,兩個新方法允許傳入表達式,表達式的結果必須直接是數值,才有可能返回true,不是數值就一定返回false。Number.isFinite()對于非數值一律返回false,就算該非數值能轉換為數值,也不去做轉換。Number.isNaN()只有對于NaN才返回true,非NaN一律返回false。
parseInt()、parseFloat()
ES6 將全局方法parseInt()和parseFloat(),移植到Number對象上面,行為完全保持不變。這樣做的目的,是逐步減少全局性方法,使得語言逐步模塊化。
Number.isInteger()
Number.isInteger()用來判斷一個數值是否為整數。
有幾個注意事項:
- 同樣的,它對于非數值也很苛刻,一律返回false,即時非數值能轉換成數值。
-
2.0
和2
在js的存儲機制上是一致的,所以Number.isInteger(2.0)
是true。
Number.EPSILON
它表示 1 與大于 1 的最小浮點數之間的差。對于 64 位浮點數來說,大于 1 的最小浮點數相當于二進制的1.00..001,小數點后面有連續 51 個零。這個值減去 1 之后,就等于 2 的 -52 次方。
這個常量確實是一個定值,而且也能寫出來,就是小數點后面51個0,然后跟一個1,這個值。但是它是干嘛的呢?
我們知道0.1 + 0.2 === 0.3
是false,這就跟js的浮點存儲機制有關系,是js天生不可避免的問題,ES6給出的解決辦法就是,開發者自己定一個精度,誤差在這個精度的就認為是相等的,就可以了。那么,我就可以寫一個數值對比函數:
function isEqual (left, right) {
return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}
Math.abs
是取絕對值,Math.pow(2, 2)是2的2次方,為什么是2次方,因為常量是2的-52次方,乘以2的2次方,等于2的-48次方,這種誤差值在不涉及金融、科研的領域,就夠用了。
然后我們測試一下:
isEqual(0.1 + 0.2, 0.3) // true
Math.trunc
Math.trunc方法用于去除一個數的小數部分,返回整數部分。
對于非數值,Math.trunc內部使用Number方法將其先轉為數值。
對于空值和無法截取整數的值,返回NaN。
對于正數,Math.trunc
與Math.floor
等價,對于負數,Math.trunc
與Math.ceil
等價。
Math.sign()
Math.sign
方法用來判斷一個數到底是正數、負數、還是零。對于非數值,會先將其轉換為數值。
它會返回五種值。
- 參數為正數,返回+1;
- 參數為負數,返回-1;
- 參數為 0,返回0;
- 參數為-0,返回-0;
- 其他值,返回NaN。
如果參數是非數值,會自動轉為數值。對于那些無法轉為數值的值,會返回NaN。