ToNumber
ToNumber 运算符根据下表将其参数转换为数值类型的值:
表12——ToNumber转换
输入类型 | 结果 |
---|---|
Undefined | NaN |
Null | +0 |
Boolean | 如果参数是 true,结果为 1。如果参数是 false,此结果为 +0。 |
Number | 结果等于输入的参数(不转换)。 |
String | 参见下文的文法和注释。 |
Object | 应用下列步骤:
|
对字符串类型应用 ToNumber
对字符串应用 ToNumber 时,对输入字符串应用如下文法。如果此文法无法将字符串解释为「字符串数值常量」的扩展,那么 ToNumber 的结果为 NaN。
语法
StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceoptStrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar ::: WhiteSpace LineTerminator
StrNumericLiteral ::: StrDecimalLiteral HexIntegerLiteral
StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral ::: Infinity DecimalDigits . DecimalDigitsopt ExponentPartopt . DecimalDigits ExponentPartopt DecimalDigits ExponentPartopt
DecimalDigits ::: DecimalDigit DecimalDigits DecimalDigit
DecimalDigit ::: 以下之一 0 1 2 3 4 5 6 7 8 9
ExponentPart ::: ExponentIndicator SignedInteger
ExponentIndicator ::: 以下之一 e E
SignedInteger ::: DecimalDigits + DecimalDigits - DecimalDigits
HexIntegerLiteral ::: 0x HexDigit 0X HexDigit HexIntegerLiteral HexDigit
HexDigit ::: 以下之一 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
需要注意到「字符串数值常量」和 「数值常量」 语法上的不同:
- 「字符串数值常量」之前和、或之后可以有空白和/或行结束符。
- 十进制的「字符串数值常量」可有任意位数的 0 在前头。
- 十进制的「字符串数值常量」可有指示其符号的 + 或 - 前缀。
- 空的,或只包含空白的「字符串值常量」會被转换为 +0。
字符串到数字值的转换,大体上类似于判定 数值常量 的数字值,不过有些细节上的不同,所以,这里给出了把字符串数值常量转换为数值类型的值的全部过程。这个值分两步来判定:首先,从字符串数值常量中导出数学值;第二步,以下面所描述的方式对该数学值进行舍入。
- 「字符串整数常量 ::: [empty]」的数学值是 0。
- 「字符串整数常量 ::: 串空白」的数学值是 0。
- 不管有没有空白「字符串整数常量 ::: 串空白 opt 串数值常量 串空白 opt」的数学值是「串数值常量」的数学值
- 「串数值常量 ::: 串十进制常量」的数学值是「串十进制常量」的数学值
- 「串数值常量 ::: 十六进制整数常量」的数学值是「十六进制整数常量」的数学值
- 「串十进制常量 ::: 串无符号整数常量」的数学值是「串无符号整数常量」的数学值
- 「串十进制常量 ::: + 串无符号整数常量」的数学值是「串无符号整数常量」的数学值。
- 「串十进制常量 ::: - 串无符号整数常量」的数学值是「串无符号整数常量」的数学值的负数。 (需要注意的是,如果「串无符号整数常量」的数学值是 0, 其负数也是 0。下面中描述的舍入规则会合适地处理小于数学零到浮点数 +0 或 -0 的变换。)
- 「串无符号整数常量 ::: Infinity」的数学值是 1010000(一个大到会舍入为 +∞ 的值过大的值会返回为 )。
- 「串无符号整数常量 ::: 十进制数 .」的数学值是「十进制数」的数学值。
- 「串无符号整数常量 ::: 十进制数 . 十进制数」的数学值是第一个「十进制数」的数学值加(第二个「十进制数」的数学值乘以 10-n),这里的 n 是 the number of characters in the 第二个「十进制数」字符数。
- 「串无符号整数常量 ::: 十进制数 . 指数部分」的数学值是「十进制数」的数学值乘以 10e, 这里的 e 是「指数部分」的数学值
- 「串无符号整数常量 ::: 十进制数 . 十进制数 指数部分」的数学值是(第一个「十进制数」的数学值加(第二个「十进制数」的数学值乘以 10-n))乘以 10e,这里的 n 是 第二个「十进制数」中的字符个数,e 是「指数部分」的数学值。
- 「串无符号整数常量 ::: . 十进制数」的数学值是「十进制数」的数学值乘以 10-n,这里的 n 是「十进制数」中的字符个数。
- 「串无符号整数常量 ::: . 十进制数 指数部分」的数学值是「十进制数」的数学值乘以 10e-n,这里的 n 是「十进制数」中的字符个数,e 是「指数部分」的数学值
- 「串无符号整数常量 ::: 十进制数」的数学值是「十进制数」的数学值
- 「串无符号整数常量 ::: 十进制数 指数部分」的数学值是「十进制数」的数学值乘以 10e,这里的 e 是「指数部分」的数学值
- 「十进制数 ::: 十进制数字」是「十进制数字」的数学值
- 「十进制数 ::: 十进制数 十进制数字」的数学值是(「十进制数」的数学值乘以 10)加「十进制数字」的数学值
- 「指数部分 ::: 幂指示符 有符号整数」的数学值是「有符号整数」的数学值
- 「有符号整数 ::: 十进制数」的数学值是「十进制数」的数学值
- 「有符号整数 ::: + 十进制数」的数学值是「十进制数」的数学值
- 「有符号整数 ::: - 十进制数」是「十进制数」的数学值的负数。
- 「十进制数字 ::: 0」或「十六进制数字 ::: 0」的数学值是 0。
- 「十进制数字 ::: 1」或「十六进制数字 ::: 1」的数学值是 1。
- 「十进制数字 ::: 2」或「十六进制数字 ::: 2」的数学值是 2。
- 「十进制数字 ::: 3」或「十六进制数字 ::: 3」的数学值是 3。
- 「十进制数字 ::: 4」或「十六进制数字 ::: 4」的数学值是 4。
- 「十进制数字 ::: 5」或「十六进制数字 ::: 5」的数学值是 5。
- 「十进制数字 ::: 6」或「十六进制数字 ::: 6」的数学值是 6。
- 「十进制数字 ::: 7」或「十六进制数字 ::: 7」的数学值是 7。
- 「十进制数字 ::: 8」或「十六进制数字 ::: 8」的数学值是 8。
- 「十进制数字 ::: 9」或「十六进制数字 ::: 9」的数学值是 9。
- 「十六进制数字 ::: a」或「十六进制数字 ::: A」的数学值是 10。
- 「十六进制数字 ::: b」或「十六进制数字 ::: B」的数学值是 11。
- 「十六进制数字 ::: c」或「十六进制数字 ::: C」的数学值是 12。
- 「十六进制数字 ::: d」或「十六进制数字 ::: D」的数学值是 13。
- 「十六进制数字 ::: e」或「十六进制数字 ::: E」的数学值是 14。
- 「十六进制数字 ::: f」或「十六进制数字 ::: F」的数学值是 15。
- 「十六进制整数常量 ::: 0x 十六进制数字」的数学值是「十六进制数字」的数学值。
- 「十六进制整数常量 ::: 0X 十六进制数字」的数学值是「十六进制数字」的数学值。
- 「十六进制整数常量 ::: 十六进制整数常量 十六进制数字」的数学值是(「十六进制整数常量」的数学值乘以 16)加「十六进制数字」的数学值。
一旦字符串数值常量的数学值被精确地确定,接下来就会被舍入为数值类型的一个值。如果数学值是 0,那么舍入值为 +0,除非字符串数值常量中第一个非空白字符是 ‘-’ — 在这种情况下,舍入值为 -0。否则,舍入值必须是数学值的 数字值 ,除非该常量包括一个「串无符号十进制常量」,且此常量多于 20 位 重要数字 — 在这种情况下,此数字的值是下面两种之一:一是将其 20 位之后的每个重要数字用 0 替换,产生此字符串解析出的数学值的数字值;二是将其 20 位之后的每个有效数字用 0 替换,并在第 20 位重要数字加一,产生此字符串解析出的数学值的数字值 。判断一个数字是否为 重要数字 ,首先它不能是「指数部分」的一部分,且
- 它不是 0;或
- 它的左边是一个非零值,右边是一个不在「指数部分」中的非零值。
更多建议: