Number 对象

2018-06-16 15:46 更新

作为函数调用的 Number 构造器

 当把 Number 当作一个函数来调用,而不是作为构造器,它执行一个类型转换。

Number ( [ value ] )

 如果提供了 value,返回 ToNumber(value) 计算出的数字值(非 Number 对象),否则返回 +0。

Number 构造器

 当把 Number 作为 new 表达式的一部分来调用,它是构造器:它初始化新创建的对象。

new Number ( [ value ] )

 新构造对象的 [[Prototype]] 内部属性设定为原始数字原型对象,它是 Number.prototype 的初始值(15.7.3.1)。

 新构造对象的 [[Class]] 内部属性设定为 "Number"。

 新构造对象的 [[PrimitiveValue]] 内部属性在提供了 value 时设定为 ToNumber(value),否则设定为 +0。

 新构造对象的 [[Extensible]] 内部属性设定为 true。

Number 构造器的属性

 Number 构造器的 [[Prototype]] 内部属性值是函数原型对象 (15.3.4)。

 除了内部属性和 length 属性(值为 1)之外,Number 构造器还有以下属性:

Number.prototype

 Number.prototype 的初始值是数字原型对象。

 这个属性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Number.MAX_VALUE

 Number.MAX_VALUE 的值是数字类型的最大正有限值,约为 1.7976931348623157 × 10308。

 这个属性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Number.MIN_VALUE

 Number.MIN_VALUE 的值是数字类型的最小正有限值,约为 5 × 10-324。

 这个属性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Number.NaN

 Number.NaN 的值是 NaN。

 这个属性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Number.NEGATIVE_INFINITY

 Number.NEGATIVE_INFINITY 的值是−∞。

 这个属性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Number.POSITIVE_INFINITY

 Number.POSITIVE_INFINITY 的值是 +∞。

 这个属性有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

数字原型对象的属性

 数字原型对象其自身是 Number 对象(其 [[Class]] 是 "Number"),其值为 +0。

 数字原型对象的 [[Prototype]] 内部属性值是标准内置 Object 原型对象 (15.2.4)。

 除非另外明确声明,以下定义的数字原型对象的方法是非通用的,传递给它们的 this 值必须是数字值或 [[Class]] 内部属性值是 "Number" 的对象。

 在以下对作为数字原型对象属性的函数的描述中,短语“this Number 对象”是指函数调用中的 this 值,或如果 Type(this 值 ) 是 Number,“this Number 对象”指仿佛是用表达式 new Number(this value) 创建的对象,这里 Number 是标准内置构造器名。此外,短语“this 数字值”是指代表 this Number 对象的数字值,也就是 this Number 对象的 [[PrimitiveValue]] 内部属性值;或如果 this 是数字类型,“this 数字值”指 this 值。如果 this 值不是 [[Class]] 内部属性为 "Number" 的对象,也不是数字类型的值,则抛出一个 TypeError 异常。

Number.prototype.constructor

 Number.prototype.constructor 的初始值是内置 Number 构造器。

Number.prototype.toString ( [ radix ] )

 可选参数 radix 应当是 2 到 36 闭区间上的整数。如果 radix 不存在或是 undefined,用数字 10 作为 radix 的值。如果 ToInteger(radix) 是数字 10,则将 this Number 对象作为一个参数传给 ToString 抽象操作;返回结果字符串值。

 如果 ToInteger(radix) 不是在 2 到 36 闭区间上的整数,则抛出一个 RangeError 异常。如果 ToInteger(radix) 是 2 到 36 的整数,担不是 10,则结果是 this 数字值使用指定基数表示法的字符串。字母 a-z 用来指值为 10 到 35 的数字。基数不为 10 时的精确算法是依赖于实现的,然而算法应当是 9.8.1 指定算法的推广形式。

 toString 函数不是通用的;如果 this 值不是数字或 Number 对象,抛出一个 TypeError 异常。因此它不能当作方法转移到其他类型对象上。

Number.prototype.toLocaleString()

 根据宿主环境的当前语言环境惯例来格式化 this 数字值,生成代表这个值的字符串。此函数是依赖于实现的,允许但不鼓励它的返回值与 toString 相同。

 此函数的第一个参数可能会用于本标准的未来版本 ; 建议实现不以任何用途使用这个参数位置。

Number.prototype.valueOf ( )

 返回 this 数字值。

 valueOf 函数不是通用的;如果 this 值不是数字或 Number 对象,抛出一个 TypeError 异常。因此它不能当作方法转移到其他类型对象上。

Number.prototype.toFixed (fractionDigits)

 返回一个包含了 -- 代表 this 数字值的留有小数点后 fractionDigits 个数字的十进制固定小数点记法 -- 的字符串。如果 fractionDigits 是 undefined,就认为是 0。具体来说,执行以下步骤:

  1. 令 f 为 ToInteger(fractionDigits). ( 如果 fractionDigits 是 undefined, 此步骤产生 0 值 ).
  2. 如果 f < 0 或 f > 20, 抛出一个 RangeError 异常 .
  3. 令 x 为 this 数字值 .
  4. 如果 x 是 NaN, 返回字符串 "NaN".
  5. 令 s 为空字符串 .
  6. 如果 x < 0, 则令 s 为 "-".令 x = –x.
  7. 如果 x ≥ 1021, 则令 m = ToString(x).
  8. 否则 , x < 1021令 n 为一个整数,让 n ÷ 10f – x 准确的数学值尽可能接近零。如果有两个这样 n 值,选择较大的 n。如果 n = 0, 令 m 为字符串 "0". 否则 , 令 m 为由 n 的十进制表示里的数组成的字符串(为了没有前导零)。如果 f ≠ 0, 则令 k 为 m 里的字符数目 .如果 k ≤ f, 则令 z 为 f+1–k 个 ‘0’ 组成的字符串 .令 m 为 串联字符串 z 的 m 的结果 .令 k = f + 1.令 a 为 m 的前 k–f 个字符,令 b 为其余 f 个字符。令 m 为 串联三个字符串 a, ".", 和 b 的结果。
  9. 返回串联字符串 s 和 m 的结果。

 toFixed 方法的 length 属性是 1。

 如果以多个参数调用 toFixed 方法,则行为是不确定的(见 15 章)。

 实现是被允许在 fractionDigits 小于 0 或大于 20 时扩展 toFixed 的行为。在这种情况下,对这样的 fractionDigits 值 toFixed 将未必抛出 RangeError。

 对于某些值,toFixed 的输出可比 toString 的更精确,因为 toString 只打印区分相邻数字值的足够的有效数字。例如 ,

 (1000000000000000128).toString() 返回 "1000000000000000100",

 而 (1000000000000000128).toFixed(0) 返回 "1000000000000000128".

Number.prototype.toExponential (fractionDigits)

 返回一个代表 this 数字值的科学计数法的字符串,它的有效数字的小数点前有一个数字,有效数字的小数点后有 fractionDigits 个数字。如果 fractionDigits 是 undefined,包括指定唯一数字值需要的尽可能多的有效数字(就像 ToString,但在这里总是以科学计数法输出)。具体来说执行以下步骤:

  1. 令 x 为 this 数字值 .
  2. 令 f 为 ToInteger(fractionDigits).
  3. 如果 x 是 NaN, 返回字符串 "NaN".
  4. 令 s 为空字符串 .
  5. 如果 x < 0, 则令 s 为 "-".令 x = –x.
  6. 如果 x = +∞, 则返回串联字符串 s 和 "Infinity" 的结果 .
  7. 如果 fractionDigits 不是 undefined 且 (f < 0 或 f > 20), 抛出一个 RangeError 异常 .
  8. 如果 x = 0, 则令 f = 0.令 m 为包含 f+1 个‘0’的字符串。令 e = 0.
  9. 否则 , x ≠ 0如果 fractionDigits 不是 undefined, 则令 e 和 n 为整数,使得满足 10f ≤ n < 10f+1 且 n × 10e–f – x 的准确数学值尽可能接近零。如果 e 和 n 有两个这样的组合,选择使 n × 10e–f 更大的组合。否则 , fractionDigits 是 undefined令 e, n, 和 f 为整数,使得满足 f ≥ 0, 10f≤ n < 10f+1, n × 10e–f 的数字值是 x, 且 f 的值尽可能小。注:n 的十进制表示有 f+1 个数字,n 不能被 10 整除,并且 n 的最少有效位数不一定唯一由这些条件确定。令 m 为由 n 的十进制表示里的数 组成的字符串(没有前导零)。
  10. 如果 f ≠ 0, 则令 a 为 m 中的第一个字符 , 令 b 为 m 中的其余字符 .令 m 为串联三个字符串 a, ".", 的 b 的结果 .
  11. 如果 e = 0, 则令 c = "+".令 d = "0".
  12. 否则如果 e > 0, 则 令 c = "+".否则 , e ≤ 0令 c = "-".令 e = –e.令 d 为有 e 的十进制表示里的数 组成的字符串(没有前导零)。
  13. 令 m 为串联四个字符串 m, "e", c, 和 d 的结果 .
  14. 返回串联字符串 s 和 m 的结果 .

 toExponential 方法的 length 属性是 1。

 如果用多于一个参数调用 toExponential 方法,则行为是未定义的 ( 见 15 章 )。

 一个实现可以扩展 fractionDigits 的值小于 0 或大于 20 时 toExponential 的行为。这种情况下对这样的 fractionDigits 值,toExponential 不一定抛出 RangeError 异常 .

 对于需要提供比上述规则更准确转换的实现,建议用以下算法作为指引替代步骤 9.b.i :

  1. 令 e, n, 和 f 为整数,使得满足 f ≥ 0, 10f≤ n < 10f+1, n × 10e–f 的数字值是 x, 且 f 的值尽可能小。如果这样的 n 值可能多个,选择使 n × 10e–f 的值尽可能接近 x 的 n 值。如果有两个这样的 n 值,选择偶数。

Number.prototype.toPrecision (precision)

 返回一个字符串,它代表 this 数字值的科学计数法(有效数字的小数点前有一个数字,有效数字的小数点后有 precision-1 个数字)或十进制固定计数法(precision 个有效数字)。如果 precision 是 undefined,用 ToString (9.8.1) 调用代替。具体来说执行以下步骤:

  1. 令 x 为 this 数字值 .
  2. 如果 precision 是 undefined, 返回 ToString(x).
  3. 令 p 为 ToInteger(precision).
  4. 如果 x 是 NaN, 返回字符串 "NaN".
  5. 令 s 为空字符串 .
  6. 如果 x < 0, 则令 s 为 "-".令 x = –x.
  7. 如果 x = +∞, 则返回串联字符串 s 和 "Infinity" 的结果 .
  8. 如果 p < 1 或 p > 21, 抛出一个 RangeError 异常 .
  9. 如果 x = 0, 则令 m 为 p 个 '0' 组成的字符串 .令 e = 0.
  10. 否则 x ≠ 0,令 e 和 n 为整数,使得满足 10p–1 ≤ n < 10p 且 n × 10e–p+1 – x 的准确数学值尽可能接近零。如果 e 和 n 有两个这样的组合,选择使 n × 10e–p+1 更大的组合。令 m 为由 n 的十进制表示里的数 组成的字符串(没有前导零)。如果 e < –6 或 e ≥ p, 则令 a 为 n 的第一个字符 , 令 b 为 m 的其余 p–1 个字符 .令 m 为串联三个字符串 a, ".", 和 b 的结果 .如果 e = 0, 则令 c = "+" ,令 d = "0".否则 e ≠ 0,如果 e > 0, 则令 c = "+".否则 e < 0,令 c = "-".令 e = –e.令 d 为由 e 的十进制表示里的数 组成的字符串(没有前导零)。令 m 为串联五个字符串 s, m, "e", c, 和 d 的结果 .
  11. 如果 e = p–1, 则返回串联字符串 s 和 m 的结果 .
  12. 如果 e ≥ 0, 则令 m 为 m 的前 e+1 个字符 , 字符‘.’, m 的其余 p– (e+1) 个字符 串联的结果 .
  13. 否则 e < 0,令 m 为 字符串 "0.", –(e+1) 个字符‘0’, 字符串 m 串联的结果 .
  14. 返回字符串 s 和 m 串联的结果 .

 toPrecision 方法的 length 属性是 1。

 如果用多于一个参数调用 toPrecision 方法,则行为是未定义的 ( 见 15 章 )。

 一个实现可以扩展 precision 的值小于 1 或大于 21 时 toPrecision 的行为。这种情况下对这样的 precision 值,toPrecision 不一定抛出 RangeError 异常 .

数字实例的属性

 数字实例从数字原型对象继承属性,数字实例的 [[Class]] 内部属性是 "Number"。数字实例还有一个 [[PrimitiveValue]] 内部属性。

 [[PrimitiveValue]] 内部属性是代表 this Number 对象的数字值。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号