ES6 數值的擴展
二進制和八進制表示法
ES6提供了二進制和八進制數值的新的寫法,分別用前綴0b(或0B)和0o(或0O)表示,
從ES5開始,在嚴格模式之中,八進制就不再允許使用前綴0表示,ES6進一步明確,要使用前綴0o表示,
0b111110111 === 503 // true
0o767 === 503 // true
如果要將0b和0o前綴的字串數值轉為十進制,要使用Number方法,
Number('0b111') // 7
Number('0o10') // 8
Number.isFinite(), Number.isNaN()
ES6在Number物件上,新提供了Number.isFinite()和Number.isNaN()兩個方法,
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
它們與傳統的全域方法isFinite()和isNaN()的區別在于,傳統方法先呼叫Number()將非數值的值轉為數值,再進行判斷,而這兩個新方法只對數值有效,非數值一律回傳false,
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.parseInt(), Number.parseFloat()
ES6將全域方法parseInt()和parseFloat(),移植到Number物件上面,行為完全保持不變,
// ES5的寫法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的寫法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45
這樣做的目的,是逐步減少全域性方法,使得語言逐步模塊化,
Number.isInteger()
Number.isInteger()用來判斷一個值是否為整數,需要注意的是,在JavaScript內部,整數和浮點數是同樣的儲存方法,所以3和3.0被視為同一個值,
Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
Number.EPSILON
ES6在Number物件上面,新增一個極小的常量Number.EPSILON,
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// '0.00000000000000022204'
引入一個這么小的量的目的,在于為浮點數計算,設定一個誤差范圍,我們知道浮點數計算是不精確的,
0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
5.551115123125783e-17.toFixed(20)
// '0.00000000000000005551'
但是如果這個誤差能夠小于Number.EPSILON,我們就可以認為得到了正確結果,
5.551115123125783e-17 < Number.EPSILON
// true
因此,Number.EPSILON的實質是一個可以接受的誤差范圍,
安全整數和Number.isSafeInteger()
JavaScript能夠準確表示的整數范圍在-253到253之間(不含兩個端點),超過這個范圍,無法精確表示這個值,
Math.pow(2, 53) // 9007199254740992
9007199254740992 // 9007199254740992
9007199254740993 // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1
// true
上面代碼中,超出2的53次方之后,一個數就不精確了,
ES6引入了Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER這兩個常量,用來表示這個范圍的上下限,
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
// true
Number.MAX_SAFE_INTEGER === 9007199254740991
// true
Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
// true
Number.MIN_SAFE_INTEGER === -9007199254740991
// true
上面代碼中,可以看到JavaScript能夠精確表示的極限,
Number.isSafeInteger()則是用來判斷一個整數是否落在這個范圍之內,
Number.isSafeInteger('a') // false
Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false
Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
實際使用這個函式時,需要注意,驗證運算結果是否落在安全整數的范圍內,不要只驗證運算結果,而要同時驗證參與運算的每個值,
Number.isSafeInteger(9007199254740993)
// false
Number.isSafeInteger(990)
// true
Number.isSafeInteger(9007199254740993 - 990)
// true
9007199254740993 - 990
// 回傳結果 9007199254740002
// 正確答案應該是 9007199254740003
上面代碼中,9007199254740993不是一個安全整數,但是Number.isSafeInteger會回傳結果,顯示計算結果是安全的,這是因為,這個數超出了精度范圍,導致在計算機內部,以9007199254740992的形式儲存,
9007199254740993 === 9007199254740992
// true
所以,如果只驗證運算結果是否為安全整數,很可能得到錯誤結果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/173815.html
標籤:其他
上一篇:Python 自動化-pywinauto庫定位樹結構控制元件里的樹節點實體演示
下一篇:模擬登錄?一文為你排憂解惑!
