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;

 

你可能感兴趣的:(读书笔记)