js数据类型转换.docx
《js数据类型转换.docx》由会员分享,可在线阅读,更多相关《js数据类型转换.docx(33页珍藏版)》请在冰豆网上搜索。
![js数据类型转换.docx](https://file1.bdocx.com/fileroot1/2023-1/2/d9b1eefa-2809-4f48-8249-58a769c9e065/d9b1eefa-2809-4f48-8249-58a769c9e0651.gif)
js数据类型转换
数据类型
通过第1章的学习,已经知道变量有简单变量和复杂变量之分,本章将讨论简单变量的有关知识。
任何一种变量都有与之相关的类,当在程序中使用数字、字符串等数据时,都会有相关的类来处理这些数据。
2.1数据类型
前面提到,变量是保存数据的容器,可以在变量中保存数字、字符串等数据,不同的数据保存的方式是不一样的,因此,变量是有类型的,这种类型称为数据类型。
在定义变量时,最好能声明变量的数据类型。
2.1.1声明数据类型
衣柜是放衣服的容器,冰箱是放食品的容器,一般来说,不会把衣服放到冰箱中,不会把食品放到衣柜中。
同样,数据的存放最好有规则,不同的数据也应放到不同的变量中。
保存数字的变量类型为Number类型,保存字符串的变量类型为String类型,定义变量时声明数据类型的形式为:
var变量名:
数据类型
例如,要定义一个表示数字的Number类型变量,可用下面的方式:
varspeed:
Number;
下面的代码定义了String类型的变量,用来表示字符串:
varmyName:
String;
当定义了变量的数据类型后,就应把某类型的数据保存在相应类型的变量中:
//保存数字
speed=5;
//保存字符串
myName="zjs";
当在时间轴编辑时,虽然可以把字符串保存到Number类型的变量中,但这并不是好的编程习惯。
在开始学习Flash编程时,就应养成什么数据类型的变量就保存什么类型数据的习惯,这不但可以提高程序的效率,更可为深入进行Flash编程打好基础。
因此,在定义变量的同时,最好声明变量的数据类型,并且把相应类型的数据保存到相应数据类型的变量中。
第1章提到的变量stage的类型为Stage类型,即类是一种数据类型。
当通过【属性】面板定义变量时,这个变量的类型也被自动声明了。
例如,定义影片剪辑实例的变量时,变量的类型为MovieClip类型;定义动态文本实例的变量时,变量的类型为TextField类型。
ActionScript3.0的数据类型可以分为简单数据类型和复杂数据类型两大类,简单数据类型只是表示简单的值,是在最低抽象层存储的值,运算速度相对较快。
前面提到的字符串、数字都属于简单数据,保存它们的变量的数据类型都是简单数据类型。
而类类型属于复杂数据类型,Stage类型、MovieClip类型和TextField类型都属于复杂数据类型,关于复杂数据类型将在下一章讲解。
ActionScript3.0的简单数据类型的值可以是数字、字符串和布尔值等,如图2.1所示。
图2.1简单数据类型
其中,int类型、uint类型和Number类型表示数字类型,String类型表示字符串类型,Boolean类型表示布尔值类型,布尔值只能是true或false。
所以,简单数据类型的变量只有3种,即数字、字符串和布尔值。
简单数据类型的变量的存储模型在第1章中已经详细介绍,这种变量只能保存一个简单的数据,本章将不再介绍。
2.1.2包装类
每一种简单数据类型都与一个类相关联,类的类名就是数据类型的名字。
例如,int类型与int类相关联,这种类一般称为包装类。
与其他传统的编程语言不同,ActionScript3.0中包装类对象并不是复杂数据类型,而是简单数据类型,所以用下面的方式定义的变量都是一样的,变量speed1和speed2都属于简单数据类型:
varspeed1:
int=4;
varspeed2:
int=newint(4);
在其他编程语言(如Java)中,变量speed1的数据类型是简单数据类型,而变量speed2则会被处理成复杂数据类型,即把简单数据4包装成int类类型。
因为编程时可能需要把简单数据作为复杂数据类型进行处理,方法就是把数据4用类包装一下。
但ActionScript3.0不会区分这种差别。
因此,不管哪种变量的赋值方法,都可以调用int类的属性和方法。
如前面所述,数据类型是与类相关联的。
Number类型也与Number类相关联,在Number类中,有一个toFixed()方法,可以控制保留小数点的位数。
可以向toFixed()传递一个数字参数,用来表示保留小数点的位数,如果没有参数输入,将只取整数部分。
toFixed()方法取小数点位数的规则是“四舍五入”,测试下面的代码:
//定义变量并赋值
varspeed:
Number=2.5647;
//取整数部分
trace(speed.toFixed());
//保留1位小数
trace(speed.toFixed
(1));
//保留2位小数
trace(speed.toFixed
(2));
输出的信息如下:
3
2.6
2.56
但这里要注意的是,虽然toFixed()能按照保留小数点的位数取近似值,但它并没有改变变量的原始值,只是返回一个新的值,而且这个值是字符串。
看下面的代码:
varspeed:
Number=2.5647;
//取整数
trace(speed.toFixed());
//查看原始值有无改变
trace(speed);
输出的结果为:
3
2.5647
从输出的结果可以看出,变量speed的值并没有改变,而且,3是字符串,而变量speed是数字。
任何一个简单数据都可以看成是类的实例。
例如,可以直接对数据进行属性和方法的调用:
trace((1.23456).toFixed());
(1.23456)中的括号是不能少的,因为这个数据中有个小数点,有了括号后,就可以区分调用方法的点语法。
因此,每种简单数据类型都和一个类相关联,当定义数据类型的变量后,就可以使用相应类的属性或方法。
2.2int类型和int类
简单地说,int类型表示整数。
int类型是一个32位有符号的整型数据类型,其有效值范围为-2147483648到2147483647。
这将提高ActionScript代码处理整数运算的能力,int将提高循环运算以及几乎其他不带小数点的整数运算。
2.2.1int类型表示整数
在int类中,有两个常数表示int类型变量取值的最大值和最小值,如表2.1所示。
表2.1int类的常数
常数
说明
MAX_VALUE
int数据类型的变量的最大值
MIN_VALUE
int数据类型的变量的最小值
int类型变量的最大值和最小值是常数,永远不会改变,所以用常量来表示这两个值。
常量名都是大写的,其中,MAX表示最大,VALUE表示值,_用于连接MAX和VALUE,从这两个属性名可以看出常量名的命名规则。
常量一般都被写成类的静态属性,即MAX_VALUE是被static修饰的,所以MAX_VALUE是表示属于int类的静态属性,只能通过类名int和点语法来直接访问。
测试下面的代码:
trace("最大值="+int.MAX_VALUE,"最小值="+int.MIN_VALUE);
可以看到输出的信息如下:
最大值=2147483647最小值=-2147483648;
这个信息表示int数据类型的变量的取值范围是-2147483648~2147483647的整数。
如果尝试给int类型变量赋值小数,Flash将自动取小数的整数部分,再将这个整数赋值给int类型变量。
通过下面的代码可以说明:
//定义int类型变量,并赋值小数
vara:
int=3.54;
trace("a="+a);
//定义另一个int类型变量,并赋值小数
varb:
int=2.14;
trace("b="+b);
输出的结果为:
a=3
b=2
从输出的信息可以看出,小数部分都被忽略了。
这在进行浮点运算时特别要小心。
例如,下面的代码进行了除法运算:
vara:
int=1;
varb:
int=3;
//把a除以b后的值赋给变量c
varc:
int=a/b;
trace("c="+c);
“/”在程序运算中表示除法,a/b表示a除以b,其结果与数学中的除法结果不同。
数学中的除法结果是0.3333,而程序执行后的结果为0,因为变量c的数据类型是int类型,被赋值的数字的小数部分会被忽略,即对于int类型来说,两个整数相除的结果肯定还是整数。
2.2.2取整数的数位
假设有一个整数为6789,要取这个整数的4个数位,即6、7、8、9。
通过int类型变量可实现这个功能。
【例2.1】本范例的源文件请见:
配套光盘\ch02\2-1.fla。
(1)打开Flash,选择【文件】|【新建】命令,在弹出的【新建文档】对话框中单击【确定】按钮,新建一个Flash文档。
(2)单击【图层1】的第1帧,选择【窗口】|【动作】命令,打开【动作】面板,输入下列代码:
//定义数字
varnum:
int=6789;
//取得数字的复制
vartemp:
int=num;
//得到千位数
vara:
int=temp/1000;
//去掉千位
temp=temp-a*1000;
//得到百位数
varb:
int=temp/100;
//去掉百位
temp=temp-b*100;
//得到十位数
varc:
int=temp/10;
//去掉十位
temp=temp-c*10;
//得到个位数
vard:
int=temp;
trace(a,b,c,d);
上面的程序使用的“-”表示减运算符,可以对数字进行减法运算;“/”表示除运算符,对数字进行除法运算;“*”表示乘运算符,可进行乘法运算。
(3)测试影片,输出结果如下:
6789
程序中得到数位的思路很简单,只是利用了int类型是整数的特点。
例如,temp/1000等于6.789,由于变量a是int类型,所以只取整数部分。
当然,这个程序可以通过更简单的方法来实现,这会在后面的学习中介绍。
2.2.3了解toString()方法
当使用trace()函数输出变量时,会自动调用toString()方法。
int类的toString()返回表示数字的字符串:
vara:
int=60;
trace(a);
当使用trace()函数时,变量a首先调用了toString()方法,返回字符串,然后trace()函数把字符串输出。
可以把上面的代码解析为下面的代码:
vara:
int=60;
vars:
String=a.toString();
trace(s);
实际上,任何类都有toString()方法,当使用trace()函数输出变量时,都会自动调用相应的toString()方法。
int类的toString()方法还可以带有参数,可以用来完成进制转换。
下面的代码把十进制转换为其他进制:
//数字60是十进制的
vara:
int=60;
//转换为二进制,输出字符串111100
trace(a.toString
(2));
//转换为八进制,输出字符串74
trace(a.toString(8));
//转换为十六进制,输出字符串3c
trace(a.toString(16));
和toString()方法相反的是parseInt()函数,它把指定的字符串转换为一定进制的数字。
下面的代码把字符串转换为数字:
//二进制转十进制,输出60
trace(parseInt("111100",2));
//十六进制转十进制,输出60
trace(parseInt("3c",16));
//八进制转十进制,输出60
trace(parseInt("74",8));
2.3uint类型与uint类
uint和int都是ActionScript3.0新增的数据类型,int和uint与Number合称为数值类型,用来表示数字。
uint类型表示无符号32位整数,即非负整数。
uint类型主要用于表现像素颜色和其他一些int所不能很好工作的领域,有效值范围为0~4294967295。
2.3.1RGB颜色
Flash的颜色值常用#FF9900或0xFF9900表示,这个颜色值是一个正整数即16750848,颜色值就是一种最常用的uint类型数据。
0xFF9900是一种十六进制的表示数值方法,前缀0x表示十六进制,利用trace()函数可以输出表示十进制的整数颜色值:
trace(0xFF9900)
颜色通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,RGB即是代表红、绿、蓝三个通道的颜色。
下面的代码声明一个uint类型变量,并赋值为0xFF9900,表示颜色值0xFF9900:
varcolor:
uint=0xFF9900;
其中,0x表示十六进制,FF表示红色值,99表示绿色值,00表示蓝色值,任何一个颜色值转换成十进制后,范围都在0~255之间。
下面的代码把十六进制表示的颜色值转换为十进制:
//输出:
255
trace(parseInt("FF",16));
//输出:
153
trace(parseInt("99",16));
//输出:
0
trace(parseInt("00",16));
如果红色值、绿色值和蓝色值都为最大即255,它们叠加后的颜色就是白色,表示白色的十六进制值就可用toString()方法计算出来:
//表示红色十进制数字
varred:
uint=255;
//表示绿色十进制数字
vargreen:
uint=255;
//表示蓝色十进制数字
varblue:
uint=255;
//把红色值255转换为十六进制
varr:
String=red.toString(16);
//把绿色值255转换为十六进制
varg:
String=green.toString(16);
//把蓝色值255转换为十六进制
varb:
String=blue.toString(16);
//加上前缀,并连接字符串
varrgb:
String="0x"+r+g+b;
//输出:
0xffffff
trace(rgb);
2.3.2键控代码
在Flash游戏中,经常会用到键控代码,键控代码肯定是一个正整数,因此,声明一个变量表示键控代码时,应声明为uint类型。
由于键控代码是不会变的,表示这种不变数据的容器叫常量,声明常量使用const关键字。
下面的代码声明常量表示键控代码:
//表示键A的代码
constKEY_A:
uint=65;
//表示键D的代码
constKEY_D:
uint=68;
//表示键S的代码
constKEY_S:
uint=83;
//表示键W的代码
constKEY_W:
uint=87;
int类型与uint类型都属于Number类型。
因此,int类型与uint类型的变量也可声明为Number类型,但从理论上讲,Flash处理Number类型速度稍慢。
2.4Number类型与Number类
数字类型变量的变量值可以是正数或负数,也可以是整数或小数等。
其中,int类型表示整数,uint类型表示非负整数,Number类型可以表示整数或小数。
2.4.1浮点数
每个影片剪辑实例运动速度都可以具有一定的帧数,帧数肯定是一个整数。
因此,在定义表示帧数的变量时,数据类型可以声明为int类型。
下面的代码声明一个int类型的变量,并赋值为4,表示第4帧:
varframeNum:
int=4;
而对于影片剪辑实例的坐标,就不一定是整数,那么,声明一个表示坐标的变量时,数据类型应是Number类型。
下面的代码声明一个Number类型的变量,并赋值为12.666,表示横坐标:
varcoordx:
Number=12.666;
2.4.2注意浮点运算
Number类型可以进行浮点运算,但也会给编程带来一些问题,下面通过一个例子来研究浮点运算的问题。
在数学中,“0.15+0.15”的值是0.3。
在编程中,可以通过trace()函数来证明“0.15+0.15”的值是多少。
结果为0.3,然后比较一下“0.15+0.15”与0.3是否相等,比较两个数字是否相等可用“==”运算符:
trace(0.15+0.15==0.3);
结果为true,说明0.15+0.15确实与0.3相等。
接下去看看其他的浮点运算,0.1+0.2与0.3是不是相等呢?
通过代码来测试:
trace(0.1+0.2==0.3);
结果为false,继续测试代码:
trace(0.1+0.2);
结果的确显示0.3,可是“0.1+0.2==0.3”结果仍然是flase。
可以通过下面的代码来探究原因:
trace(0.1+0.2-0.3);
结果是5.55111512312578e-17,也就是相差大约5乘10的-17次方。
Flash里面的数字,整数计算没有误差,而浮点数计算总会出现误差。
所以一定要避免程序因此而出现问题。
整个应用程序可能由于某行代码的误差而失败。
也就是说,能用整数的地方最好用整数。
例如,对于浮点数,千万不能用“==”判断两个数是否相等。
如果是循环,用大于、小于。
如果一定要判断浮点数相等的话,你应把“a==b”用“(ab-1e-15)”来代替,也就是要求a和b差别很小,而不是相等。
出于上述理由,我们能用整数尽量用整数,即不需要进行浮点运算时,用int类型或uint类型。
在程序中有时可能需要直接使用数字,这里特别要注意的是,即使直接使用的数字是整数,这个整数的数据类型还是Number类型,而不是int类型或uint类型。
例如,在Java中,下面的结果是0。
vara:
Number=1/3;
因为Java把1和3作为整数类型处理,两个整数相除的结果肯定是整数,但ActionScript3.0是把1和3处理成Number类型,也就是说,1/3的结果不是0,而是0.33333。
2.5Boolean类型与Boolean类
在一个游戏检测中,鼠标与游戏角色的位置关系只有两种,要么鼠标在游戏角色内,要么鼠标在游戏角色外,像这种非此即彼的数据用Boolean类型表示。
Boolean类型的变量的取值用true或false表示,true或false也称为布尔值。
例如,鼠标在游戏角色内为true,鼠标在游戏角色外就为false。
下面的代码声明了一个Boolean类型的变量,并赋值为false,表示鼠标在游戏角色外:
varisTouching:
Boolean=false;
当Flash对Boolean类型进行处理时,会把true转换为1,把false转换为0。
下面的代码可测试出这个过程:
varisTouching:
Boolean=false;
trace(isTouching==0);
输出结果为true,证明false在处理时确实被转换为0了。
==是比较运算符,可用于比较两个变量值是否相等。
如果相等,则返回true;如果不相等,则返回false。
前面用到的“=”与“==”是完全不同的,“=”是赋值运算符,可以把一个数据赋值给变量。
而“==”是比较运算符,这里用于比较两个数据是否相等。
2.6String类型与String类
由双引号或单引号括起来的都可看成是字符串,字符串的数据类型属于String类型,每个String类型的变量都拥有String类的属性和方法。
2.6.1定义字符串
看下面的代码:
//使用双引号
vars1:
String="string";
//使用单引号
vars2:
String='string';
//使用中文
vars3:
String="字符串";
//空字符串
vars4:
String="";
//含数字的字符串
vars5:
String="55666";
//含特殊字符
vars6:
String=*77#@;
//有默认值为null
vars7:
String;
在使用单引号和双引号时,单引号和双引号必须成对地出现在字符串的首尾。
看下面的代码:
//错误,尾部缺少了双引号
vars:
String="thisislisha;
另外,不能首部用双引号,而尾部用单引号。
下面的代码也是错误的:
//错误,没有成对使用引号
vars:
String="thisislisha';
而下面的代码是正确的:
vars:
String="thisislisha'";
其中,双引号用来表示字符串,而单引号则表示字符,这样就可以在字符串中使用单引号了,同样,如果要在字符串使用双引号,可用下面的方式:
vars:
String='thisis"lisha"';
2.6.2字符串的索引
String类有个名为length的属性,可以获取字符串的长度,即字符的个数。
下面的代码输出字符串zjs35的长度:
varmyname:
String="zjs35";
trace(myname.length);
结果为5,代表字符的个数。
字符串的索引可用图2.2表示。
图2.2字符串的索引
字符串的索引从0开始,依次递增,每个索引分别代表相应位置的单个字符。
索引0到4代表有5个单个字符,意为字符串的长度。
如果输出的结果为5,表示字符串含有5个字符。
一些特殊的字符如回车符、制表符虽然是不可见的,但计算字符串的长度时也是计算在内的。
String类含有很多方法,当定义一个String类型的变量后,就可以用点语法来访问String类的这些方法。
表2.2列出了String类的部分方法。
表2.2String类的部分方法
方法
说明
charAt(index:
Number=0):
String
返回指定索引的字符
charCodeAt(index:
Number=0):
Number
返回一个0~65 535之间的16位整数,它表示由index指定的字符
concat(...args):
String
将String对象的值与参数合并,并返回新组成的字符串;而原始值不变
fromCharCode(...charCodes):
String
[静态]返回一个由参数中的Unicode值表示的字符组成的字符串
上表列出1个静态方法和3个非静态方法,静态方法只能通过类名(即String)来访问,而非静态方法须通过变量来访问。
下面的代码使用了表中的4个方法:
//定义表示字符串变量
varmyname:
String="zjs35";
//取得索引为1的字符
trace(myname.charAt
(1));
//取得索引为1的字符的Unicode代码
trace(myname.charCodeAt
(1));
//把字符串zjs35与_flash连接成新的字符串
trace(myname.concat("_flash"));
//根据Unicode代码返回字符
trace(String.fromCharCode(106));
输出的结果为:
j
106
zjs35_flash
j
上面的代码中,提到了Unicode编码,Unicode给每个字符提供了一个唯一的数字。
因为计算机只是处理数字,计算机指定一个数字,来储存字母或其他字符。
例如,字符j的Unicode代码为106。
操作字符串有时比操作数字更加方便,下面是操作字符串来实现取数位的另一种方法。
【例2.2】本范例的源文件请见:
配套光盘