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) // 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
console.log( Number.parseInt === parseInt ); // true
console.log( Number.parseFloat === parseFloat );// true
注意:在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
js能够准确表示的整数范围在 到
之间(
,
)(不包括两个端点),超过该范围就无法精确表示。
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
上面观察出:超出后,一个数就不精确了。
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
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
对于非数值,会先将其转换为数值。
其返回值有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;