强制转换html5,ES5/类型转换与测试

ECMAScript运行环境会在需要时执行自动类型转换。定义一套关于转换的抽象操作有助于阐明某些结构的语义。这些抽象操作不是语言本身的一部分;它们被定义在这里是为了协助语言的语义规范。这些关于转换的抽象操作是多态的,它们可以接受任何ECMAScript语言类型,但不能接受规范类型。

ToPrimitive

ToPrimitive 抽象操作接受一个值,和一个可选的期望类型作参数。ToPrimitive 运算符把其值参数转换为非对象类型。如果对象有能力被转换为不止一种原语类型,可以使用可选的期望类型来暗示那个类型。根据下表完成转换: 9692a4ea335c6575c3a6d3b3f54b3446.png

输入类型

结果

未定义

结果等于输入的参数(不转换)。

空值

结果等于输入的参数(不转换)。

布尔值

结果等于输入的参数(不转换)。

数值

结果等于输入的参数(不转换)。

字符串

结果等于输入的参数(不转换)。

对象

返回该对象的默认值。调用该对象的内部方法 [[DefaultValue]] 来恢复这个默认值,调用时传递暗示期望类型(所有 ECAMScript 本地对象的 [[DefaultValue]] 一樣)。

ToBoolean

ToBoolean 抽象操作根据下表将其参数转换为布尔值类型的值: 9692a4ea335c6575c3a6d3b3f54b3446.png

输入类型

结果

未定义

false

空值

false

布尔值

结果等于输入的参数(不转换)。

数值

如果参数是 +0, -0, 或 NaN,结果为 false ;否则结果为 true。

字符串

如果参数是空字符串(其长度为零),结果为 false,否则结果为 true。

对象

true

ToNumber

ToNumber 抽象操作根据下表将其参数转换为数值类型的值:9692a4ea335c6575c3a6d3b3f54b3446.png

输入类型

结果

未定义

NaN

空值

+0

布尔值

如果参数是 true,结果为 1。如果参数是 false,此结果为 +0。

数字

结果等于输入的参数(不转换)。

字符串

参见下文的文法和注释。

对象

应用下列步骤:

令primValue为 ToPrimitive(输入参数, 暗示数值类型)。

返回 ToNumber(primValue)。

对字符串类型应用 ToNumber

对字符串应用 ToNumber 时,对输入字符串应用如下文法。如果此文法无法将字符串解释为 ToNumber 的结果为 NaN。 9692a4ea335c6575c3a6d3b3f54b3446.png

DecimalDigit ::: one of

0 1 2 3 4 5 6 7 8 9

ExponentIndicator ::: one of

e E

HexDigit ::: one of

0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

字符串到数字值的转换,大体上类似于判定 数字值,不过有些细节上的不同,所以,这里给出了把

一旦字符串数值常量的数学值被精确地确定,接下来就会被舍入为数值类型的一个值。如果数学值是 0,那么舍入值为 +0,否则如果字符串数值常量中第一个非空白字符是 ‘-’,舍入值为 -0。对于其它情况,舍入后的值必须是其数学值的数字值。如果该字面量包含一个 20 位有效数字,则此数字的值是下面两种之一:一是将其 20 位之后的每个数位用 0 替换,产生此字符串解析出的数学值的数字值;二是将其 20 位之后的每个数位用 0 替换,并在第 20 位有效数字加一,产生此字符串解析出的数学值的数字值6501a72b1d5dc50d22055e6deccbbedf.png。判断一个数位是否为有效数位,首先它不能是

它不是 0;或

它的左边是一个非零值,右边是一个不在

ToInteger

ToInteger 抽象操作将其参数转换为整数值。9692a4ea335c6575c3a6d3b3f54b3446.png

此运算符功能如下所示:

令 number 为对输入的参数调用 ToNumber 的结果。

如果 number 是 NaN 则返回 +0。

如果 number 是 +0、 -0、 +∞ 或 -∞ 则返回 number。

返回计算 sign(number)×floor(abs(number)) 的结果。

ToInt32:(32 位有符号整数)

ToInt32 抽象操作将其参数转换为 在 -231 到 231-1 闭区间内的 232 个整数中的任意一个。9692a4ea335c6575c3a6d3b3f54b3446.png

此运算符功能如下所示:

令 number 为对输入的参数调用 ToNumber 的结果。

如果 number 是 NaN、 +0、 -0、 +∞ 或 -∞ 则返回 +0。

令 posInt 为 sign(number)×floor(abs(number)) 的结果。

令 int32bit 为 posInt modulo 232;也就是说,假如有一个数值类型的有限正整数 k ,它小于 232 ,那么 posInt 与 k 在数学上可能相差 232 的整数倍。

如果 int32bit 大于或等于 231 则返回 int32bit-232 否则返回 int32bit。

注:上面对 ToInt32 的定义中:

ToInt32 抽象操作是幂等的:对同一个值调用一次和调用两次这个操作会得到同样的结果。

对于任意的 x 值,ToInt32(ToUint32(x)) 总是等价于 ToInt32(x)。(它延续了后者将 +∞ 和 -∞ 映射到 +0 的性质)

ToInt32 会将 -0 映射到 +0。

ToUint32:(32 位无符号整数)

ToUint32 抽象操作将其参数转换为 在 0 到 232-1 闭区间内的 232 个整数中的任意一个。 9692a4ea335c6575c3a6d3b3f54b3446.png

此运算符功能如下所示:

令 number 为对输入的参数调用 ToNumber 的结果。

如果 number 是 NaN、 +0、 -0、 +∞ 或 -∞ 则返回 +0。

令 posInt 为 sign(number)×floor(abs(number)) 的结果。

令 int32bit 为 posInt modulo 232;也就是说,假如有一个数值类型的有限正整数 k ,它小于 232 ,那么 posInt 与 k 在数学上可能相差 232 的整数倍。

返回 int32bit。

注:上面对 ToUint32 的定义中:

ToUint32 与 ToInt32 之间唯有 第5步 不同。

ToUint32 抽象操作是幂等的:对同一个值调用一次和调用两次这个操作会得到同样的结果。

对于任意的 x 值,ToUint32(ToInt32(x)) 总是等价于 ToUint32(x)。(它延续了后者将 +∞ 和 -∞ 映射到 +0 的性质)

ToUint32 会将 -0 映射到 +0。

ToUint16:(16 位无符号整数)

ToUint16 抽象操作将其参数转换为 在 0 到 216-1 闭区间内的 216 个整数中的任意一个。86acd174fe54cc1abae36b5b92e07b55.png

此运算符功能如下所示:

令 number 为对输入的参数调用 ToNumber 的结果。

如果 number 是 NaN、 +0、 -0、 +∞ 或 -∞ 则返回 +0。

令 posInt 为 sign(number)×floor(abs(number)) 的结果。

令 int16bit 为 posInt modulo 216;也就是说,假如有一个数值类型的有限正整数 k ,它小于 216 ,那么 posInt 与 k 在数学上可能相差 216 的整数倍。

返回 int16bit。

注: 上面给出的 ToUint16 的定义中:

ToUint16 和 ToUint32 之间唯一的不同是 第4步 中,216 取代了 232。

ToUint16 会将 -0 映射为 +0。

ToString

ToString 运算符根据下表将其参数转换为字符串类型的值:9692a4ea335c6575c3a6d3b3f54b3446.png

输入类型

结果

未定义

"undefined"

空值

"null"

布尔值

如果参数是 true,那么结果为 "true"。

如果参数是 false,那么结果为 "false"。

字符串

返回输入的参数(不转换)。

对象

应用下列步骤:

令 primValue 为 ToPrimitive(输入参数, 暗示字符串类型)。

返回 ToString(primValue)。

对数值类型应用 ToString

ToString 抽象操作将数字 m 转换为字符串格式的给出如下所示:9692a4ea335c6575c3a6d3b3f54b3446.png

如果 m 是 NaN,返回字符串 "NaN"。

如果 m 是 +0 或 -0,返回字符串 "0"。

如果 m 小于零,返回连接 "-" 和 ToString(-m) 的字符串。

如果 m 无限大,返回字符串 "Infinity"。

否则,令 n、k 和 s 皆为整数,且满足 k ≥ 1 且 10k-1 ≤ s < 10k 、 s×10n-k 的数字值为 m 且 k 足够小。注意 k 是 s 的十进制位数。s 不能被 10 整除,且 s 的至少要求的有效数字位数不一定要被这些标准唯一确定。 86acd174fe54cc1abae36b5b92e07b55.png

如果 k ≤ n ≤ 21,返回由 k 个 s 在十进制表示中的数字组成的字符串(有序的,开头没有零),后面连接 n-k 个 "0" 字符。

如果 0 < n ≤ 21,返回由 s 在十进制表示中的、最多 n 个有效数字组成的字符串,后面跟随一个小数点 ".",再后面是余下的 k-n 个 s 在十进制表示中的数字。

如果 -6 < n ≤ 0,返回由字符 "0" 组成的字符串,后面跟随一个小数点 ".",再后面是 -n 个 "0" 字符,最后是 k 个 s 在十进制表示中的数字。

否则,如果 k = 1,返回由单个数字 s 组成的字符串,后面跟随小写字母 "e",根据 n-1 是正或负,再后面是一个加号 "+" 或减号 "-" ,再往后是整数 abs(n-1) 的十进制表示(没有前置的零)。

返回由 s 在十进制表示中的、最多的有效数字组成的字符串,后面跟随一个小数点 ".",再后面是余下的是 k-1 个 s 在十进制表示中的数字,再往后是小写字母 "e",根据 n-1 是正或负,再后面是一个加号 "+" 或减号 "-" ,再往后是整数 abs(n-1) 的十进制表示(没有前置的零)。

注:下面的评语可能对指导实现有用,但不是本标准的常规要求。

如果 x 是除 -0 以外的任一数字值,那么 ToNumber(ToString(x)) 与 x 是完全相同的数字值。

s 至少要求的有效数字位数并非总是由 第5步 中所列的要求唯一确定。

注:对于那些提供了比上面的规则所要求的更精确的转换的实现,我们推荐下面这个步骤 5 的可选版本,作为指导:

否则,令 n, k, 和 s 是整数,使得 k ≥ 1, 10k-1 ≤ s < 10k,s×10n-k 的数字值是 m,且 k 足够小。如果有数倍于 s 的可能性,选择 s × 10n-k 最接近于 m 的值作为 s 的值。如果 s 有两个这样可能的值,选择是偶数的那个。要注意的是,k 是 s 在十进制表示中的数字的个数,且 s 不被 10 整除。

注:ECMAScript 的实现者们可能会发现,David M 所写的关于浮点数进行二进制到十进制转换方面的文章和代码很有用:

Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary

Conversions. Numerical Analysis Manuscript 90-10. AT&T Bell

Laboratories (Murray Hill, New Jersey). November 30, 1990. 在这里取得

http://cm.bell-labs.com/cm/cs/doc/90/4-10.ps.gz 。有关的代码在这里

http://cm.bell-labs.com/netlib/fp/dtoa.c.gz 还有

http://cm.bell-labs.com/netlib/fp/g_fmt.c.gz 。这些都可在众多的 netlib 镜像站点上找到。

ToObject

ToObject 抽象操作根据下表将其参数转换为对象类型的值:9692a4ea335c6575c3a6d3b3f54b3446.png

输入类型

结果

未定义

抛出 TypeError 异常。

空值

抛出 TypeError 异常。

字符串

对象

结果是输入的参数(不转换)。

CheckObjectCoercible

根据 表15 定义,抽象操作 CheckObjectCoercible 在其参数无法用 ToObject 转换成对象的情况下抛出一个异常:9692a4ea335c6575c3a6d3b3f54b3446.png

表15 - CheckObjectCoercible 结果

输入类型

结果

未定义

抛出一个 TypeError 异常

空值

抛出一个 TypeError 异常

布尔值

返回

数值

返回

字符串

返回

对象

返回

IsCallable

根据 表16,抽象操作 IsCallable 确定其必须是 ECMAScript 语言值的参数是否是一个可调用对象:9692a4ea335c6575c3a6d3b3f54b3446.png

表16 - IsCallable 结果

输入类型

结果

未定义

返回 false。

空值

返回 false。

布尔值

返回 false。

数值

返回 false。

字符串

返回 false。

对象

如果参数对象包含一个 [[Call]] 内部方法,则返回 true,否则返回 false。

SameValue 算法

内部严格比较操作 SameValue(x,y),x 和 y 为 ECMAScript 语言中的值,需要产出 true 或 false。86acd174fe54cc1abae36b5b92e07b55.png86acd174fe54cc1abae36b5b92e07b55.png9692a4ea335c6575c3a6d3b3f54b3446.png

比较过程如下:

如果 Type(x) 与 Type(y) 的结果不一致,返回 false,否则

如果 Type(x) 结果为 Undefined,返回 true

如果 Type(x) 结果为 Null,返回 true

如果 Type(x) 结果为 Number,则

如果 x 为 NaN,且 y 也为 NaN,返回 true

如果 x 为 +0,y 为 -0,返回 false

如果 x 为 -0,y 为 +0,返回 false

如果 x 与 y 为同一个数字,返回 true

返回 false

如果 Type(x) 结果为 String,如果 x 与 y 为完全相同的字符序列(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false

如果 Type(x) 结果为 Boolean,如果 x 与 y 都为 true 或 false,则返回 true,否则,返回 false

如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值