《深入理解JavaScript》—— 数字

(1) 一个数字的字面量可以是整型、浮点型和十六进制(整型)。

(2) 其中指数eX,是10的x次方的缩写。例如:

5e2  // 500
5e-2  // 0.05

(3) 转换为数字

结果
undefined NaN
null 0
布尔值 false转换成0,true转换成1
数字 保持不变
字符串 解析字符串中的数字(忽略开头和结尾的空格),空字符串转换成0
对象 调用ToPrimitive(value,number)并转换生成的原始类型

全局函数parseFloat()提供了一种将值转换为数字的方法。

将str转换成字符串,去掉开头的空格,然后解析最长的浮点数字形式的前缀。如果没有这样的前缀,则返回NaN。

(4) 比较parseFloat()和Number()方法:

●  对非字符串使用parseFloat()的效率低,因为在解析之前会将参数强制转换成字符串。因此,许多被Number()转换成数字的值转换成了NaN。

parseFloat( true );  // NaN
Number( true );  // 1

●  parseFloat()方法会将空字符串解析成NaN

●  parseFloat()会一直解析到最后一个合法字符,这意味着最后得到的可能不是我们想要的结果:

parseFloat( '123.65#' );  // 123.65#
Number( '123.65#' );  // NaN

●  parseFloat()会忽略开头的空格,并在非法的字符(包括空格)前停止,而Number()会忽略开头和结尾的空格(但其他非法的字符都会导致解析成NaN)

parseFloat( '	v
12.34
' );  // 12.34
Number( '	v
12.34
' ); // NaN

(5) 特殊的数字值

① NaN

NaN是唯一一个和自身不相等的值:

console.log ( NaN === NaN );  // false

如果要检查一个值是否为NaN,那么可以调用全局函数isNaN():

isNaN(NaN); // true
isNaN(33); // false

但是这里有个问题,isNaN对非数字不起作用,因为它首先是将这些值转换成数字。转换可能生成NaN,然后函数错误的返回true。

console.log ( isNaN('xyz') );  // true

因此最好的办法是将isNaN和类型检查结合起来:

function checkNaN( value ) {
    return typeof value === 'number' && isNaN (value);
}

或者是检查这个值和它本身不相等(因为NaN是唯一有这样特征的值):

function checkNaN( value ) {
    return typeof value !== value;
}

最后一点:NaN和任何值作比较,包括它自身都是不相等的。

② Infinity

Infinity是一个错误值,它指出了两个错误:一个是大到无法表示的数字,另一个就是除以了0。

Infinity的运算

1.如果尝试用一个Infinity区抵消另一个Infinity,那么会得到错误的结果:

console.log ( Infinity - Infinity );  // NaN

2.如果试图得到一个比Infinity更大的数字,那么它将还是Infinity:

console.log ( Infinity + Infinity );  // Infinity
console.log ( Infinity * Infinity );  // Infinity

另外,使用全局函数isFinite()可以检查一个值是否是一个实际的值(既不是Infinity也不是NaN)。

③ 两个0

由于JavaScript数字的数值和符号是分开储存的所以每一个非负数都有一个负值,包括0。

JavaScript努力隐瞒它有2个0这一事实,所以通常情况下,我们就当做一个0来处理就好。

(6) 数字的内部表示

JavaScript的数字是64位精度的,也叫作双精度(某些编程语言中double类型)

(7) 转换成整数

注:在JavaScript中,所有的数字都是浮点数。而整数是没有小数部分的浮点数。

一般有以下几种转换:

1.Math函数:Math.floor(),Math.ceil()以及Math.round()

2.二进制位运算操作符

3.全局函数parseInt()

4.定制的ToInteger()函数

注:不应该用parseInt()将数字转换成整数:因为参数首先会被转换成字符串,会走不少弯路,且结果也不一定正确。

(8) 算术运算符

1.这里有个误区,必须首先解释清楚。number1 % number2 ,这里的%是求余,不是取模运算!

求余操作符的结果通常和第一个操作数的符号相同,而取模运算和第二个操作数的符号相同。

// Wrong!
function odd( n ) {
    return n%2 === 1;
}
console.log ( odd(-5) );  // false

// True
function odd( n ) {
    return Math.abs(n%2) === 1;
}
console.log ( odd(-5) );  // 1

2. +number

保持参数不变,如果number是非数字,则会转换成数字

(9) Number函数

Number函数有2中调用模式:

1.Number(value)

作为一个常规函数,它将value转换成一个原始数字

console.log ( Number('123') );  // 123

2.new Number(num)

 作为构造函数,创建了一个Number的实例,即包装了num的对象(在转换成一个数字后)

var a = new Number( 123 );
console.log ( typeof a );  // object

(10) Number构造器属性

Number对象有如下属性:

1.Number.MAX_VALUE  : 可表示的最大正数。其内部结构为,所有的小数部分都为1,指数为最大值1023。

console.log ( Number.MAX_VALUE );  //  1.7976931348623157e+308

2.Number.MIN_VALUE  : 可表示的最小的正数值。

console.log ( Number.MIN_VALUE );  //  5e-324

3.Number.NaN  : 与全局NaN相同的值

4.Number.NEGATIVE_INFINITY  : 与-Infinity相同的值

5.Number.POSITIVE_INFINITY  :  与Infinity相同的值

(11) Number原型方法(其中?为可选参数)

原始值中所有的方法都储存在Number.prototype中。

1. Number.prototype.toFixed(fractionDigits?)  : 返回不使用指数表示的数字,舍入到小数点后第fractionDigits位。默认参数是0。

2. Number.prototype.toPrecision(precision?)  :  在使用类似toString()等转换算法前会将尾数精确到precision位。如果没有给出precision,那么会直接使用toString()方法。

3. Number.prototype.toString(radix?)  : 参数中radix指定了显示数字的系统使用的基数。最常见的就是10进制、2进制和16进制。

4. Number.prototype.toExponential(fractionDigits?)  : 强制使用指数标注来显示一个数字。fractionDigits是一个在0~20的数字,他决定了应该在小数点前显示多少个数字。如果省略掉,那么会使用尽可能多的数字来唯一指定数字

(12) 用于数字的函数

下列函数用于操作数字:

1. isFinite(number)  : 检查number是否为一个实际的数字(不是Infinity也不是NaN).

2. isNaN(number)  : 如果number为NaN,则返回true。

3. parseInt(str)  : 将str解析为一个浮点数。 

4. parsefloat(str,radix?)  : 将str解析为一个基为radix(2-36)的整数。

原文地址:https://www.cnblogs.com/luohaoran/p/5961258.html