JavaScript只有一种数值类型:number
。包括整数和带小数的十进制数。
toExponential()
以指数表示法表示数值字符串。
var a = 5E10
a.toExponential() // "5e+10"
toFixed(num)
指定小数部分的显示位数。
var a = 23.902
a.toFixed(2) // "23.90"
toPrecision(num)
指定整个数字的显示位数。
var a = 23.902
a.toPrecision(2) // "24"
对于.
运算符要注意,因为它是一个有效的数字字符,会被优先识别为数字常量的一部分,然后才是对象属性访问运算符:
23.toPrecision(1) // Uncaught SyntaxError: Invalid or unexpected token
23..toPrecision(1) // "2e+1"
23.902.toPrecision(1) // "2e+1"
(23).toPrecision(1) // "2e+1"
23 .toPrecision(1) // "2e+1",注意有空格哦,但是不建议这种写法
Number.EPSILON
值通常为2^-52(2.220446049250313e-16)
ES6之前版本的polyfill代码:
if (!Number.EPSILON) {
Number.EPSILON = Math.pow(2, -52)
}
范围
- 能够呈现的最大浮点数:
Number.MAX_VALUE
// 1.7976931348623157e+308 - 能够呈现的最小浮点数:
Number.MIN_VALUE
// 5e-324 - 能够被“安全”呈现的最大整数:
Number.MAX_SAFE_INTEGER
// 9007199254740991 - 能够被“安全”呈现的最小整数:
Number.MIN_SAFE_INTEGER
// -9007199254740991 - 检测一个值是否为整数,可以使用
Number.isInteger(num)
方法
ES6之前的polyfill代码:
if (!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == 'number' && num % 1 == 0
}
}
- 检测一个值是否为安全的整数,可以使用
Number.isSafeInteger(num)
方法
ES6之前的polyfill代码:
if (!Number.isSafeInteger) {
Number.isSafeInteger = function(num) {
return Number.isInteger(num) && Math.abs(num) <= Number.MAX_SAFE_INTEGER
}
}
不是值的值
- undefined指没有值,或是未赋值,可以作为标识符
- null指空值,赋过值为空,是关键字,不能作为标识符
undefined可以被赋值为局部变量:
function foo() {
var undefined = 1
console.log(undefined)
}
foo() // 1
void 0
和void a
都没有返回值,可以作为undefined
(underscore中就用void 0
代替undefined
)。
NaN意思是“不是数字”,但依然是数字类型。
var a = 1 / 'true' // NaN
typeof a // "number"
NaN != NaN // true
可以用isNaN()
来判断这个值是不是NaN:
isNaN(NaN) // true
isNaN(23) // false
但是对于字符串,isNaN()
也会返回true:
isNaN("oneday") // true
但是ES6有一个Number.isNaN(num)
方法可以避免这个bug:
Number.isNaN("oneday") // false
ES6之前版本的polyfill代码:
if (!Number.isNaN) {
Number.isNaN = function(num) {
return (
typeof num === 'number' && window.isNaN(num)
)
}
}
或者直接利用自身与自身不相等的性质...
if (!Number.isNaN) {
Number.isNaN = function(num) {
return num !== num
}
}
关于Infinity和-Infinity:
var a = 1 / 0 // Infinity
计算一旦得到Infinity,就回不去了:
a - a // NaN
a + 1 // Infinity
a / a // NaN
1 / a // 0
乘法和除法运算会得到-0,但是加法和减法不会得到-0。
-0可以为动画保留方向信息。
0 / -3 // -0
0 * -1 // -0
-0 === 0 // true
Object.is()
判断两个值是否绝对相等。
var a = 1 / "oneday"
var b = 0 * -3
Object.is(a, NaN) // true
Object.is(b, -0) // true
ES6之前版本的polyfill代码:
if (!Object.is) {
Object.is = function(v1, v2) {
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2
}
if (v1 !== v1) {
return v2 !== v2
}
return v1 === v2
}
}