(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)的整数。