ES6:數值的擴展

Number. is Finite() 用來檢查一個數值是否爲有限的(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。

Number.isNaN()只有對於NaN才返回true,非NaN一律返回false。

console.log( isFinite(25) );   // true
console.log( isFinite('25') ); // true
console.log( Number.isFinite(25) ); // true
console.log( Number.isFinite('25') ); // false

console.log( isNaN(NaN) );// true
console.log( isNaN('NaN') );// true
console.log( Number.isNaN(NaN) );// true
console.log( Number.isNaN('NaN') );// false
console.log( Number.isNaN(1) );// false

Number.parseInt()、Number.parseFloat()

console.log( Number.parseInt === parseInt );    // true
console.log( Number.parseFloat === parseFloat );// true

Number.isInteger() 用來判斷一個值是否爲整數。

注意:在js內部,整數和浮點數是同樣的存儲方法,因此3和3.0視爲同一個值。

console.log( Number.isInteger(25) );   // true
console.log( Number.isInteger(25.0) ); // true
console.log( Number.isInteger(25.1) ); // false
console.log( Number.isInteger('15') ); // false
console.log( Number.isInteger(true) ); // false

Number.isSafeInteger () 用來判斷一個整數是否落在安全整數範圍之內

js能夠準確表示的整數範圍在 -2^{53}2^{53}之間(-2^{53},2^{53})(不包括兩個端點),超過該範圍就無法精確表示。

console.log( Number.MIN_SAFE_INTEGER ); // -9007199254740991
console.log( Number.MAX_SAFE_INTEGER ); // 9007199254740991

console.log( Number.MAX_SAFE_INTEGER === Math . pow(2, 53) - 1 )    // true
console.log( Number.MAX_SAFE_INTEGER === 9007199254740991 )         // true
console.log( Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER ) // true
console.log( Number.MIN_SAFE_INTEGER === -9007199254740991 )        // true

console.log( Math.pow(2,53) );  // 9007199254740992
console.log( Math.pow(2,53) === Math.pow(2,53)+1 );  // true
console.log( 9007199254740992 ); // 9007199254740992
console.log( 9007199254740993 ); // 9007199254740992

上面觀察出:超出2^{53}後,一個數就不精確了。

ES6引入了Number.MIN_SAFE_INTEGER和Number.MAX_SAFE_INTEGER兩個常量,表示這個範圍的上下限。

console.log( Number.isSafeInteger ('a') );       // false
console.log( Number.isSafeInteger(null) );       // false 
console.log( Number.isSafeInteger(NaN) );        // false
console.log( Number.isSafeInteger(Infinity) );   // false 
console.log( Number.isSafeInteger(-Infinity) );  // false
console.log( Number.isSafeInteger(3) );   // true
console.log( Number.isSafeInteger(3.0) ); // true
console.log( Number.isSafeInteger(1.2) ); // false
console.log( Number.isSafeInteger(9007199254740990) );  // true
console.log( Number.isSafeInteger(9007199254740992) );  // false
console.log( Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) );  // false
console.log( Number.isSafeInteger(Number.MIN_SAFE_INTEGER) ); // true
console.log( Number.isSafeInteger(Number.MAX_SAFE_INTEGER) ); // true
console.log( Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) );  // false

實際使用這個函數時,需要注意驗證運算結果是否落在安全整數的範圍內,另外不要只驗證運算結果,還要同時驗證參與運算的每個值。

console.log( Number.isSafeInteger(9007199254740993) );  // false
console.log( Number.isSafeInteger(990) );  // true
console.log( Number.isSafeInteger(9007199254740993 - 990) ); // true

下面函數 同時檢測運算數和運算結果

function trusty (left, right, result) {
    if (
    Number.isSafeInteger(left) &&
    Number.isSafeInteger(right) &&
    Number.isSafeInteger(result)
    ){
        return result ;
    }
    throw new RangeError ('Operation cannot be trusted 1') ;
}
console.log( trusty(1, 2, 3) ) // 3
console.log( trusty(9007199254740993 , 990 , 9007199254740993 - 990) )
// Uncaught RangeError: Operation cannot be trusted 1

Math對象的擴展

Math.trunc() 用於去除一個數的小數部分。

console.log( Math.trunc(4.1) )     // 4
console.log( Math.trunc(4.9) )     // 4
console.log( Math.trunc(-4.1) )    // -4
console.log( Math.trunc(-4.9) )    // -4
console.log( Math.trunc(-0.1234) ) // -0

對於非數值,Math.trunc()內部使用Number方法將其先轉爲數值。

console.log( Math.trunc('-123.456') ) // -123

對於空值和無法截取整數的值,返回NaN。

console.log( Math.trunc( NaN ) ) ;     // NaN
console.log( Math.trunc ( 'foo' ) ) ;  // NaN
console.log( Math.trunc() ) ;          // NaN

Math.sign() 用來判斷一個數到底是正數、負數、還是0。

對於非數值,會先將其轉換爲數值。

其返回值有5種情況:

參數爲正數,返回+1;

參數爲負數,返回-1;

參數爲0,返回0;

參數爲-0,返回-0;

其他值,返回NaN。

console.log( Math.sign(-5) )    // -1
console.log( Math.sign(5) )     // 1
console.log( Math.sign(0) )     // 0
console.log( Math.sign(-0) )    // -0
console.log( Math.sign(NaN) )   //NaN
console.log( Math.sign('9') )   // 1
console.log( Math.sign('foo') ) // NaN
console.log( Math.sign() )      // NaN 

console.log( 0===-0 )      // true 
console.log( 1===+1 )      // true 

指數運算符

ES2016新增了一個指數運算符(**)。

console.log(2**2);  // 4
console.log(2**3);  // 8
console.log(2**4);  // 16
let aa = 1.5;
aa **= 2;
console.log(aa);  // 2.25
//等同於aa= aa * aa ;

let bb = 4;
bb **= 3;
console.log(bb);  // 64
//等同於bb= bb * bb * bb;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章