《深入理解JavaScript》—— 数字

本文详细介绍了JavaScript中的数字类型,包括整型、浮点型、十六进制数字的表示方法,特殊数字值如NaN和Infinity的处理方式,数字的内部表示形式,以及如何进行数字与字符串之间的转换。

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

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

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

(3) 转换为数字

结果
undefinedNaN
null0
布尔值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( '\t\v\r12.34\n' );  // 12.34
Number( '\t\v\r12.34\n' ); // 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值