与 Boolean 对象类似,Number 对象也为数值提供了重要能力。但是,考虑到两者存在同样的潜在 问题,因此并不建议直接实例化 Number 对象。在处理原始数值和引用数值时,typeof 和 instacnceof 操作符会返回不同的结果,如下所示:

let numberObject = new Number(10);
    let numberValue = 10;
    console.log(typeof numberObject);             // "object"
    console.log(typeof numberValue);              // "number"
    console.log(numberObject instanceof Number);  // true
    console.log(numberValue instanceof Number);   // false

原始数值在调用 typeof 时始终返回"number",而 Number 对象则返回"object"。类似地,Number 对象是 Number 类型的实例,而原始数值不是。

isInteger()方法与安全整数:

ES6 新增了 Number.isInteger()方法,用于辨别一个数值是否保存为整数。有时候,小数位的 0可能会让人误以为数值是一个浮点值:

console.log(Number.isInteger(1));    // true
    console.log(Number.isInteger(1.00)); // true
    console.log(Number.isInteger(1.01)); // false

在这个范围内二进制值可以表示一个整数值。这个数值 范围从 Number.MIN_SAFE_INTEGER(253 + 1)到Number.MAX_SAFE_INTEGER(253 * 1)。

对超出这 3 个范围的数值,即使尝试保存为整数,IEEE 754 编码格式也意味着二进制值可能会表示一个完全不同的 数值。为了鉴别整数是否在这个范围内,可以使用 Number.isSafeInteger()方法。

console.log(Number.isSafeInteger(-1 * (2 ** 53)));      // false
    console.log(Number.isSafeInteger(-1 * (2 ** 53) + 1));  // true
    console.log(Number.isSafeInteger(2 ** 53));             // false
    console.log(Number.isSafeInteger((2 ** 53) - 1));       // true

用于格式化数值的方法是 toExponential(),返回以科学记数法(也称为指数记数法)表 示的数值字符串。与 toFixed()一样,toExponential()也接收一个参数,表示结果中小数的位数。 来看下面的例子:

let num = 10;
    console.log(num.toExponential(1));  // "1.0e+1"

这段代码的输出为"1.0e+1"。一般来说,这么小的数不用表示为科学记数法形式。如果想得到数 值最适当的形式,那么可以使用 toPrecision()。

toPrecision()方法会根据情况返回最合理的输出结果,可能是固定长度,也可能是科学记数法 形式。这个方法接收一个参数,表示结果中数字的总位数(不包含指数)。来看几个例子:

let num = 99;
    console.log(num.toPrecision(1)); // "1e+2"
    console.log(num.toPrecision(2)); // "99"
    console.log(num.toPrecision(3)); // "99.0"

在这个例子中,首先要用 1 位数字表示数值 99,得到"1e+2",也就是 100。因为 99 不能只用 1 位 数字来精确表示,所以这个方法就将它舍入为 100,这样就可以只用 1 位数字(及其科学记数法形式) 来表示了。

用 2 位数字表示 99 得到"99",用 3 位数字则是"99.0"。本质上,toPrecision()方法会 根据数值和精度来决定调用 toFixed()还是 toExponential()。为了以正确的小数位精确表示数值, 这 3 个方法都会向上或向下舍入。