ActionScript被ActionScript虚拟机执行,而ActionScript虚拟机是FlashPlayer的一部分。
常用图形处理软件
矢量图形软件IIIustrator;位图图像处理软件Photoshop。
一切面向对象
在Java 中,值类型并不是以对象形式存在的。值类型的变量,存储的不是引用,而是直接容纳了具体的值(Value)。在ActionScript3中则不一样,因为本质上,值类型仍然是对象。值类型是一种特殊的对象,叫做不变对象(immutable object)。一旦虚拟机发现指向一个对象的引用要改变该不变对象的值,就会另行创建一个新的不变对象来接受新的值。
关键字
AS3中定义常量用const,定义变量用var。
Number类型bug:
1.小数相加不一定能得到整数。
比如,我们声明一个变量floatB,初始值为零,让它连加10 次0.1。我们期望得到数值1,但实际上我们得不到,只能得到一个莫名其妙的0.9999999999999999
在编程时避免用这样的算法。如果实在需要浮点数相加得到整数,那么要记得使用Math.round()来修正。
2.不要让数值差距过大的浮点数相加减,结果可能有偏差。
比如,让100 000 000 和0.000 000 001相加。我们期望结果是100 000 000.000 000 001,但实际上结果是100 000 000。无论我们让它们相加多少遍,
结果都是100 000 000。一般来说,只要数值差距不超过十几位,不会有问题。
AS3中的数组:
在ActionScript3中,数组是以非负整数为索引的稀疏数组(sparse array),不支持类型化数组(typed array)。
所谓非类型化数组,意思就是我们并不限制所有盒子都要放同一种类型的数据。所谓稀疏数组,意思就是不要求每个盒子都要装东西,比如我们可以让第1个和第9个装东西,其他留空。
ActionScript3 支持不规则的多维数组。所谓不规则,是指每个维度的子元素数目没必要一致。
强大的Object类:
//写入多个属性,属性名和属性值以“:”号隔开,属性之间以“,”号隔开
var foo:Object = {name:"kingda",web:"www.kingda.org"};
trace (foo.name);
//直接写入多个方法。这种形式很少用到,在这里只是告诉大家,可以这样运用。格式同上。
var bar:Object = {hello:function(){trace ("Hello,guys!");},
ok:function():String{return"that’s ok";}};
bar.hello();
//输出:Hello,guys!
Object 可以动态添加属性。看下例:
//先初始化,即新建一个空对象,将其引用赋值给变量kingda
Var kingda:Object = {};
//新增一个属性name,将字符串“黑羽”赋值给它
kingda.name = "黑羽";
//新增一个属性gender,将数字1 赋值给它
kingda.gender = 1;
trace (kingda.name);
//输出:黑羽
也可以动态添加方法,接上例:
kingda.hello = function(){
trace("Hi,ActionScript 3")
}
kingda.hello();
//输出:Hi,ActionScript 3
函数
在 ActionScript 3 中可以设置函数的默认参数。如果调用函数时,没有写明参数,那么会调用该参数默认值代替。(scala里有同样的功能,java里无)
function (参数1:类型=默认值,参数2:类型=默认值):返回类型{...}
在函数中传入的参数都被保留在了函数自动生成的一个 arguments 对象中。arguments如同一个数组,按参数定义的顺序保存着传入的参数。可以使
用 arguments[0]、arguments[1]访问传入的第一个参数、第二个参数,依次类推。 它有一个属性 length 表示当前传入参数的数目;还有一个属性 callee 持有指向当前函数的引用,常常用来创建递归。
在 ActionScript 2 中可以无视一个函数的定义,传入任意多的参数。但在 ActionScript 3 中,要严格遵守函数定义,否则就是非法的。为了提供这种传入任意参数的灵活性,ActionScript 3 提供了一个新的关键字...(rest)。只要在参数中定了...(rest),那么就可以接受任意多的参数。这些参数,以数组形式保留在 rest 中。rest 只是推荐的命名,我们可以改成其他的名字,比如 paras。另外要注意,一旦使用了...(rest)关键字, 那么 arguments 就不能再使用了。
函数可以层层嵌套。(scala里函数也可嵌套,java不行)
函数表达式定义法定义函数(scala可以,java不可以)
var aFunc:Function = function() {
trace ("This is bFunc!Excuted!");
}
Java 读者注意:
从语法上区分的话,如果类名前有dynamic 关键字,那么这个类就是动态类;如果没有,那么就是密封类。
强调一点,this 关键字只限于实例属性和实例方法。因为this 关键字必须要指代一个具体的实例,而静态方法和静态属性是不和任何实例相关联的。因此 this 关键字不能用在静态方法中,也不能用来访问静态属性。
internal:包内访问,如果一个类成员前面没有加任何访问控制符,那么将被默认为internal。
protected:不提供包内成员访问,只有子类才能访问。
在ActionScript3 中,只提供了对接口的支持,并没有提供对抽象类的支持。
ActionScript3中接口不可以定义常量。因此,Java 中的常量接口不能实现。
运算符:
1.如果等于运算符(或不等于运算符)两边的基元数据类型不相同,那么会执行类型转换后,再做比较。而全等运算符(===)和等于运算符(==)的不同在于,
全等运算符不执行类型转换。这就意味着,不同类型变量之间的比较用全等运算符一定会返回false。唯一的例外,就是全等运算符对于数值类型一视同仁,所以,
如果int、uint、Number类型数值相同,那么全等运算符也会认为相同。
2.要指出的是,等于运算符和全等运算符对于变量默认值的比较是不同的。当两边运算对象的值都是Number 类型,且值为NaN 时,全等和等于运算符都判断为false。
3.但如果两边运算对象的值是undefined和null时,等于运算符判断为相等,返回true,而全等运算符判断不等,返回false。当运算符一边的运算对象是数值,
另一边运算对象是非数值时:非数值的运算对象会尽量转换成数值,然后再进行数值比较。
4.如果运算符两边的运算对象都是字符串的话,那么将按照从左到右按字母顺序来挨个进行比较。
typeof、is、as
typeof是用字符串形式返回对象的类型。使用方法如下:
trace (typeof 10); //输出:number
is 用来判断一个对象是否属于一种类型。使用格式如下:
trace (9 is Number); //输出:true
as 与is格式一致,内容不同:如果一个对象属于一种类型,那么as返回这个对象;否则返回null。例子:
trace (9 as Number); //输出:9
trace (9 as Array); //输出:null
in 关键字用来判断一个对象是否作为另一个对象的键(Key)或索引,存在返回true,不存在返回false。
var a:Array = ["q","w","e"];
trace(2 in a); //数组a 含有索引2,所以为true
var b:Object = {ary:a, name:"ok"};
trace ("ary" in b); //true,确实有ary为键的属性
在ActionScript3 中,delete 关键字的作用已经大大减少,它只可以来用删除对象的动态实例属性,非动态属性不能删除。
如果要将一个属性所持有的引用删除,将null 赋值给该属性即可。
var b:Object = {ary:"one",name:"ok"};
deleted b; //会报错,不能这样删除了,正确用法 b = null;
deleted b.ary; //成功,因为ary是b对象的动态属性
标签用法
所谓标签用法,其实设计意图简单。就是命名一下各层循环,这个名字就是标签(Label)然后break(或continue)语句后面带上这个标签,不就可以指定break(或continue)那一层循环了吗?就这么简单。
break 标签;
continue 标签;