第四节 数据类型转换 更进一步地观察来自前一个部分的例子。该例中,每个数据 —— "1"和2 —— 都属于它们各自的数据类型;第一个数据是字符串而第二个则是数字。我们看到解释器将两个值连接在一起形成字符串"12"。注意,解释器首先必须将数字2转换为字符串"2",只有该自动转换完成之后,值"2"(串)才能被连接到串"1"上。
数据类型转换只是意味着某个数据的类型的改变。并非所有的数据类型转换都是自动的;当然,如果我们不外在地改变某个数据的类型,ActionScript会默认执行数据类型定义;相反,如果我们希望屏蔽ActionScript自动定义数据类型这一行为,我们则可以外在地、明确地改变数据的类型。
1.自动的类型转换 只要我们在某个语境中使用一个数据类型不匹配的值,解释器就试图转换。也就是说,如果解释器期待类型A的数据,而我们却提供了类型B的数据,解释器将尝试将类型B的数据转换为类型A的数据。例如,在下列代码中我们使用字符串"Flash"作为减号操作符右边的操作数。因为只有数字才可以被用于减号操作符,所以解释器试图将字符串"Flash"转换为一个数字: 999 - "Flash";
当然,串"Flash"无法成功地被转换成任何合法的数字,因此它被转换为特殊的数字数据值NaN(即,Not-a-Number)。NaN是数字数据类型的一个合法值,明确地被指定用于处理上述的情况。由于"Flash"被转换为NaN,我们的表达式对解释器来说最终看起来象这样(尽管我们永远不可能看到这一内部步骤): 999 - NaN;
现在,减号操作符两边的操作数都是数字,因此该操作可以继续下去:999 - NaN产生了值NaN,这就是我们的表达式的最终值。
产生数字值NaN的表达式并无特殊用途;大多数转换能产生更具功能性的结果,例如,如果某个字符串只包含数字字符,那么它可以被转换为一个有用的数字。表达式: 999 - "9"; // the number 999 minus the string "9"
在解释器内部转换为: 999 - 9; // the number 999 minus the number 9
当表达式被求解时它产生了值990。自动的转换最常见于加号操作符、比较操作符,以及条件和与循环语句(Alvin注:比较操作符包括等于、不等于、大于和小于,等等)。为了确定包含自动转换的任何表达式的计算结果,我们必须回答三个问题:(1)在当前的上下文关系(语境)中,所期待的数据类型是什么?(2)在该上下文关系中,如果提供一个并不是被期待的数据类型,会发生什么?而且(3)当转换发生时,因此而产生的值是什么?
要回答头两个问题,我们需要参阅一些适当的主题,这些主题可在本书的其他章节中找到(例如,为了确定在一个条件语句中哪种数据类型被期待出现,可以参考有关条件语句的章节)。
下面的三个列表列出了自动转换的规则,它们回答了第三个问题,“当转换发生时,因此而产生的值是什么?”。
表一显示了每种数据类型转换成数字后的结果。
表一 转换为数字 原始数据 转换后的结果 —————————————— undefined 0 null 0 布尔值 1(如果原始值为true)或0(如果原始值为false) 数字字符串 如果字符串仅由十进制数字、指数、小数点、加号、减号或空白组成(例如,"-1.23e4"),那么转换后的结果即是该字符串所描述的数字值。(Alvin注:有关空白(空格、制表符);空白所在位置很微妙,如果仅在字符串的开端有空白,并不影响字符串转换为我们期待的数字;例如,字符串" 123.456"将转换成数字123.456。如果空白在字符串的中央("123.4 56")或在字符串的末尾("123.456 ")则会产生一个NaN。同样地,减号、加号也是如此,你可以尝试将它们放在字符串的不同位置,观察产生的结果。有关指数,e;当其在字符串开端的时候,会产生一个NaN,而在字符串中间时,我们都知道,这是正常的,恕不赘述;那么,当其在字符串末尾时,比如,"123e",又会怎样呢?回答:在转换过程中,解释器认为指数是零,即123e0,结果当然是123本身了。有关小数点;如果小数点在字符串的开端,那么解释器默认该字符串为纯小数,例如,".123"在转换后变成0.123;如果在中央,伙计,这还用我说吗?如果在末尾,解释器认为该字符串转换成数字后的小数位是零,即没有小数位;如,"123."转换后的结果是数字123。) 其他字符串 空字符串、非数字字符串,包括由"x","0x",或"FF"为开头的字符串,都转换为NaN "Infinity" Infinity "-Infinity" -Infinity "NaN" NaN 数组 NaN 对象 该对象的valueOf ()方法的返回值。 电影剪辑 NaN
表二显示了每种数据类型转换成字符串后的结果
表二 转换为字符串 原始数据 转换后的结果 —————————————— undefined ""(空字符串) null "null" 布尔值 "true"(如果原始值为true)或"false(如果原始值为false) NaN "NaN" 0 "0" Infinity "Infinity" -Infinity "-Infinity" 其他数字值 字符串与该值的字面一样。例如,987.321变成"987.321"。 数组 由逗号分隔的元素值列表 对象 对该对象调用toString ()方法而产生的结果。缺省情况下,某个对象的toString ()方法会返回"[object Object]"。当然,toString ()方法也能够被定制为返回一个更有用的结果(例如,一个Date对象的toString ()可以返回:"Sun Jan 12 11:33:18 EDT 2003") 电影剪辑 该电影剪辑实例的路径。始于播放器中该电影剪辑所在的电影文档层,是绝对路径;例如,"_level0.ball"
表三显示了每种数据类型转换成布尔值后的结果
表三 转换为布尔值 原始数据 转换后的结果 —————————————— undefined false null false NaN false 0 false Infinity true -Infinity true 其他数字值 true 非空字符串 如果该字符串能被转换成一个有效的非零数字,则为true,否则,为false。在ECMA-262标准中,一个非空字符串总是能被转换为true(为了与Flash 4版本保持兼容,Flash 5和Flash MX版本突破了该规则) 空字符串("") false 数组 true 对象 true 电影剪辑 true
to be continue... alvin
出处:蓝色理想
责任编辑:无意
上一页 数据和数据类型(3) - 创建并分类数据 下一页
◎进入论坛Flash专栏版块参加讨论
|