参考:
数字
在 JavaScript
里面,数字都是双精度浮点类型的(也就是说一个数字只能在 -(2^53^ -1) 和 2^53^ -1之间)。没有特定的整型数据类型。除了能够表示浮点数,数字类型有三个符号值: +Infinity
、-Infinity
和 NaN
(not-a-number)。
十进制数字(Decimal numbers)
1
2
3
4
5
6
7
|
1234567890
42
// 数字第一个为零的注意事项:
0888 // 888 将被当做十进制处理
0777 // 在非严格格式下会被当做八进制处理 (用十进制表示就是511)
|
请注意,十进制可以以0开头,后面接其他十进制数字,但是假如后面接的十进制数字小于8,那么该数字将会被当做八进制处理。
数字对象
1
2
3
4
5
6
7
8
9
10
11
12
|
Number.MIN_SAFE_INTEGER; // -9007199254740991
Number.MAX_SAFE_INTEGER; // 9007199254740991
// 判断传递的值是否为整数。
Number.isInteger('123'); // false
Number.isInteger(123); // true
Number.isInteger(a); // false
Number.isInteger(''); // false
Number.isInteger(12.1); // false
Number.isInteger(12a); // Uncaught SyntaxError: missing ) after argument list
Number.isInteger(12.0); // true
|
Number.prototype
的方法
toFixed()
方法使用定点表示法来格式化一个数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var numObj = 12345.6789;
numObj.toFixed(); // 返回 "12346":进行四舍五入,不包括小数部分
numObj.toFixed(1); // 返回 "12345.7":进行四舍五入
numObj.toFixed(6); // 返回 "12345.678900":用0填充
(1.23e+20).toFixed(2); // 返回 "123000000000000000000.00"
(1.23e-10).toFixed(2); // 返回 "0.00"
2.34.toFixed(1); // 返回 "2.3"
-2.34.toFixed(1); // 返回 -2.3 (由于操作符优先级,负数不会返回字符串)
(-2.34).toFixed(1); // 返回 "-2.3" (若用括号提高优先级,则返回字符串)
|
toExponential()
方法以指数表示法返回该数值字符串表示形式。
参数
fractionDigits
可选。一个整数,用来指定小数点后有几位数字。默认情况下用尽可能多的位数来显示数字。
返回值
一个用幂的形式 (科学技术法) 来表示Number 对象的字符串。小数点后以fractionDigits 提供的值来四舍五入。如果 fractionDigits 参数被忽略了,小数点后的将尽可能用最多的位数来表示该数值。
对数值字面量使用 toExponential() 方法,且该数值没有小数点和指数时,应该在该数值与该方法之间隔开一个空格,以避免点号被解释为一个小数点。也可以使用两个点号调用该方法。
如果一个数值的小数位数多余 fractionDigits 参数所提供的,则该数值将会在 fractionDigits 指定的小数位数处四舍五入。可以查看 toFixed() 方法描述中关于四舍五入的讨论,同样应用于 toExponential() 方法。
1
2
3
4
5
6
7
8
9
10
11
|
var numObj = 77.1234;
alert("numObj.toExponential() is " + numObj.toExponential()); //输出 7.71234e+1
alert("numObj.toExponential(4) is " + numObj.toExponential(4)); //输出 7.7123e+1
alert("numObj.toExponential(2) is " + numObj.toExponential(2)); //输出 7.71e+1
alert("77.1234.toExponential() is " + 77.1234.toExponential()); //输出 7.71234e+1
alert("77 .toExponential() is " + 77 .toExponential()); //输出 7.7e+1
|
toPrecision()
方法以指定的精度返回该数值对象的字符串表示。
1
2
3
4
5
6
7
8
|
var numObj = 5.123456;
console.log("numObj.toPrecision() is " + numObj.toPrecision()); //输出 5.123456
console.log("numObj.toPrecision(5) is " + numObj.toPrecision(5)); //输出 5.1235
console.log("numObj.toPrecision(2) is " + numObj.toPrecision(2)); //输出 5.1
console.log("numObj.toPrecision(1) is " + numObj.toPrecision(1)); //输出 5
// 注意:在某些情况下会以指数表示法返回
console.log((1234.5).toPrecision(2)); // "1.2e+3"
|
日期对象
JavaScript
处理日期数据类似于Java。这两种语言有许多一样的处理日期的方法,也都是以1970年1月1日00:00:00以来的毫秒
数来储存数据类型的。
Date 对象的范围是相对距离 UTC 1970年1月1日 的前后 100,000,000 天。
Date对象的方法
处理日期时间的Date对象方法可分为以下几类:
- “set” 方法, 用于设置Date对象的日期和时间的值。
- “get” 方法,用于获取Date对象的日期和时间的值。
- “to” 方法,用于返回Date对象的字符串格式的值。
- parse 和UTC 方法, 用于解析Date字符串。
通过“get”和“set”方法,你可以分别设置和获取秒,分,时,日,星期,月份,年。这里有个getDay方法可以放回星期,但是没有相应的setDay方法用了设置星期,因为星期事自动设置的。这些方法用整数来代表以下这些值:
- 秒,分: 0 至 59
- 时: 0 至 23
- 星期: 0 (周日) 至 6 (周六)
- 日期:1 至 31
- 月份: 0 (一月) to 11 (十二月)
- 年份: 从1900开始的年数
Number.EPSILON
ES6在Number对象上面,新增一个极小的常量Number.EPSILON
。
1
2
3
4
|
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// '0.00000000000000022204'
|
引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。
1
2
3
4
5
6
7
8
|
0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
5.551115123125783e-17.toFixed(20)
// '0.00000000000000005551'
|
但是如果这个误差能够小于Number.EPSILON
,我们就可以认为得到了正确结果。
1
2
|
5.551115123125783e-17 < Number.EPSILON
// true
|
因此,Number.EPSILON
的实质是一个可以接受的误差范围。
一个误差检查函数:
1
2
3
4
5
6
7
|
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON;
}
withinErrorMargin(0.1 + 0.2, 0.3)
// true
withinErrorMargin(0.2 + 0.2, 0.3)
// false
|
Math对象的扩展
Math.trunc()
Math.trunc
方法用于去除一个数的小数部分,返回整数部分。
1
2
3
4
5
|
Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0
|
对于没有部署这个方法的环境,可以用下面的代码模拟。
1
2
3
|
Math.trunc = Math.trunc || function(x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
};
|