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 0void 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
    }
}

results matching ""

    No results matching ""