★序言:《ActionScript权威指南》由Colin Moock原著,赵声攀等翻译。虽然是一本讲解FLASH 5的编程书籍,但它却是我目前所看到过的,国内最好的一本AS入门书籍。感谢本书带我真正步入AS的殿堂!我把这本书看了四五遍,对其进行了支解、扩展和重构,我现在的AS知识体系基本上都是来自这本书,现在我把这其中的精髓提炼成十篇左右的文章,以后每天来贴一篇。
★她虽然是讲AS1.0的,但更多涉及的是AS底层的原理性的东西。这些东西永远不会过时,除非AS真的由解释型语言转变成编译型了,或者语法重写了。另外,如果不特别说明,所有的测试平台都是MX 2004,AS 2.0,也就是说虽然是AS1.0的东西,但我的测试环境是2.0的,它们在2.0中也适用。
★这些都是一些很基础的东西,再加上我总结它们的时候,自己也是入门级,所以他们特别适合AS菜鸟,当然如果你并非Colin Moock那样的AS绝顶高手,最好也看一下,最起码起到查漏补缺的作用。假如你发现有些东西竟然是第一次知道,那我只能很遗憾的告诉你,你还未真正步入 AS的殿堂,放下一味追新那浮躁的心,好好看看这些东西吧!
★最后想说的是,由于我自己的水平也是很业余的,所以肯定有很多总结的不对的地方,把它们贴出来,也是希望能有高人帮我纠正一下,火山荣幸&&感激!
★1:typeof操作符可以测得变量的数据类型。例:trace(typeof x); //输出undefined
注:typeof得到的是一个串,例:if (typeof x=="undefined"){……};Undefined必须加上引号!→页码:P27
★2:在AS1.0中,无真正的全局变量,但可以用下面的方法模拟:Object.prototype.myGlobalVariable=myVariable; →P63
★3: {x:10,y:20} //花括号以及被逗号分隔开的属性名/值对表示是一个对象。→P77
★4:任何数字与NaN进行四则运算的结果都为 NaN。→P79
★5:屏幕文本域输入的内容一定为串,如果想对其执行数学运算,必须用Number()函数进行转化。→P83
★6:数据类型的自动转换中,转换的只是原数据的拷贝,只是一个临时的转换!→P84
★7:当调用toString()方法把数字转化为串的时候,应该这样写:(100).toString(); //用括号防止“.”被当作小数点。→P82
★8:FLASH使用双精度浮点数,支持大约15位精度的有效数字。注意:精度不等于大小。“大约”又是什么意思呢?→P92
★9:NaN是一种合法的数据类型。但如果两个变量的值都是NaN,他们并不相等。→P94
★10:在AS中,串也可以用单引号表示,单双引号可以交叉使用,但必须首尾层次对应。→P96
★11:含有一个空格的串与空串并不相等:即:"" != " " 。→P101
★12:相对于substr()和slice()函数,subString()函数是最佳的选择,效率最高。→P113
★13:当我们最初定义一个变量的时候,它的值会默认为undefined。→P122
★14:引用一个不存在的变量,会返回undefined。→P123
★15:从理论上说,null类型和undefined类型是一样的。但null值不是由解释程序自动赋值的,而需要我们人为赋值。用以表示不含任何数据类型数据的合法空数据容器。注意:null只等于自身和undefined。→P123
★ 补充1:一个影片剪辑被卸载掉后,它所包括的变量也就无法再被访问。(卸载的方式包括:unLoadMovie(),载入其它影片,空白关键贞。)
★ 补充2:时间线上的变量必须先声明,才能在其后的贞中访问,但一旦声明后,就能在所有的贞中访问了。
例如:在主时间线上建立三个空白关键贞,并依次在每贞中写代码:trace(a); var a="huoshan"; trace(a);运行的结果将会是:
undefined
huoshan
huoshan
huoshan
…… (同上)
★16:AS模除法中,5%4.5=0.5; 余数可以为小数。→P134
★17:operand1 || operand2 从理论上讲,处理逻辑or的第一个步骤是将operand1转换为布尔,如果转换的结果是true,那么逻辑or就返回operand1的值;否则逻辑 or就转向operand2进行求值。如果operand1已经可以转换为true,就不再理会operand2。→P146
★18:逻辑and 和or的运算机理相似。→P148
★19:delete操作符可删除一个对象,一个对象属性,一个数组元素,或变量。→P153
★20:数组元素操作符可用作对象属性操作符。例:ball["radius"]=150;其实,从功能上说,点操作符和[]操作符在功能上是一样的,可以用来设置和获取对象的属性值。 →P153
★21:条件操作符的语法格式:condition ? result_if_true : result_if_false; 例:
Var guess"c";
Var answer="d";
Var response = (guess==answer) ? "right" : "wrong";
如果guess等于answer,则response的值为"right",如果不是,则response的值为"wrong"; →P154
★22:function function_name(argument_list) {};上面的语句中,function 是函数声明语句,function_name是一个标识符(函数标识符),()是函数调用操作符。→P154
★23:function语句总是必须包含一个语句块,即使被声明的函数中只包含一个语句。→P159
★24:没有return语句的函数将返回undefined。→P164
★25:条件语句的测试表达式不一定要求出布尔值,任何表达式都可以,他们将按照AS数据类型的自动转换规则来进行转换。→P171
★26:条件语句,当只有一个语句的时候,可省去{},如下:if (x==y) trace("y");→P177
★27:条件表达式不一定要求出布尔值,任何表达式都可以,但是此表达式的结果将按照FLASH数据类型的自动转换规则转换为布尔值。→P189
★28:在FLASH PLAYER 5 中,循环被限制在15秒内。→P189
★29:当执行任一贞的脚本时,影片场景在视觉上要等到脚本结束才能够更新。→P191
★30:enterFrame 事件处理器一旦开始就无法停止,惟一的办法就是删除此影片剪辑。→P193
★31:可以用空白关键贞以及attachMovie()和 removeMovieClip()有效控制影片剪辑enterFrame循环事件的开始和结束。→P194
★32:函数变元(即传递给函数的实际参数)在传递给函数前就被先求值。→P203
★33:在同一贞的代码中,函数可以在被声名前调用。→P208
★34:函数会先在局部作用域中查找变量,如果没有找到,就会在其所在的时间线或所属对象与类中查找,如果还没有找到,则返回undefined。→P209
★35:当局域变量在函数的结尾死亡时,和他们对应的存储器空间就会被释放。因此使用局域变量存储所有的临时值,就能在程序中避免存储器的浪费。→P212
★36:形式参数和实际参数的数目可以不等。→P213
★37:传递给函数的参数可以用arguments对象访问。→P213
★38:对于原始数据类型的参数,函数接受到的是数据的拷贝,而复合数据类型的参数,函数接受到的则是一个指针,指向原数据。→P215
★39:从理论上说,函数应该是一种特殊的对象。→P220
★40:当播放头进到某贞后,先执行代码,然后更新屏幕,并播放声音。→P227
★41:当我们为剪辑添加事件处理器的时候,处理器中定义的变量,其作用域将在此剪辑的时间线上,内部的this将指向当前的剪辑。→P234
★42:按扭处理器的作用域是按扭所在的时间线(注意:不是按扭本身),其内部的this将指向它所在的时间线上。→P237
★43:一个MC的内容被 unLoadMovie()函数卸载后,马上就会有一个空的占位符MC被载入到该MC中。所以,一个unLoadMovie()事件必将导致一个 loadMovie()事件的发生;反之亦然。→P245
★44:影片剪辑的用户输入事件会被所有的MC以及_root所接受,并做出响应的反应。→P250
★45:影片剪辑事件处理器具有记忆特性,事件的每次发生都会记录在贞中间,并在每一贞得到渲染时,在屏幕中显示出来。如果想让渲染在事件的每次发生时都即时进行,以让渲染能平滑进行,可以使用updateAfterEvent()函数,但按扭事件不能用此函数。→P259
★46:数组可以有空元素,这样的数组成为稀疏数组。→P266
★47:delete操作符可以删除一个命名数组元素,并释放内存。语法:delete arrayName.elementName;→P274
★48:FLASH 5只支持一维数组。→P289
★49:方法其实就是实现对象行为的函数。→P293
★50:在单纯的OOP中,一般不直接访问对象的属性,而是调用方法来访问属性的值。→P297
★51:在每一个对象里重复地复制相同的函数时,会造成存储器的浪费。→P302
★52:传统上,类构造器的首字母大写。→P303
★53:在 FLASH 5中,类的方法可以在类构造器外定义。→P306
★54:函数同时也是对象,可以带属性。创建构造器函数的时候,解释程序会自动赋值一个称为原型(prototype)的属性。→P308
★55:_ _proto_ _属性主要用来查找对象继承属性,也即对象的prototype属性。此属性是在任何对象被创建的时候,解释程序自动赋给它的属性。→P311
★56:内置对象在FLASH播放器启动的时候,会自动由解释程序创建,并在影片播放的过程中保持有效。→P319
★57:影片剪辑中的一个变量就是它的一个属性。→P321
★58:一般把FLASH文档里的主影片叫作主影片时间线或_root。一个.swf文件可以从播放器中删除,但一个主影片却不能从.swf文件中删除。duplicateMovieClip(),removeMovieClip(),swapDepths()方法用在主影片上是无效的。另外,FLASH播放器可以包含多个.swf文件,但每一个.swf文件只能包含一个主影片。→P324
★59:在希望保留剪辑的事件处理器和复制过程中的转换的时候,要使用duplicateMovieClip(),而不是attachMovie()。如果一定要使用 attachMovie()的话,可以将事件处理器中的代码改用函数直接量的方式写在此剪辑中。→P325
★60:每一个剪辑实例的名称都可以用剪辑内置属性_name来访问和设置。→P330
★61:如果手动创建的MC没有命名,它将在运行的时候,由播放器自动赋给一个类似 instance1,instance2……instancen之类的名称,但n到底是几,我们无法控制。→P331
★62:loadMovie() 函数会在语句块儿中最后执行,所以,不能在同一个语句块儿中,访问被加载的外部影片的属性和方法。→P332
★63:不能从一个文档的库中添加剪辑到其它文档。所以,当一个剪辑中加载了一个外部.swf文件后,就不能对此剪辑使用duplicateMovieClip()和 attachMovie()方法了。→P333
★64:剪辑深度值有间隙不会造成存储器的浪费。→P337
★65:装载新的.swf到 _level2上,会在视觉上覆盖_level1上的影片,但不会把它从播放器中删除。→P337
★66:unloadMovie()将删除剪辑的内容和自定义属性与函数,但不删除内置属性与方法还有剪辑本身。要完全删除,可以使用removeMovieClip()函数。→P354
★67:在unloadMovie()函数中,如果使用了一个不存在的剪辑或层级作为它的参数,那么调用此函数的剪辑本身将被卸载。→P354
★68:全局函数和剪辑方法在表面上看一样,但它们在本质上完全不同,比如unloadMovie()等。→P359
★69:原始数据按值传递,复合数据按地址传递。→P379
★70:
x=[1,2,3];
y=[1,2,3];
trace(x==y); //得到false
x=y;
trace(x==y); //得到true
复合数据比较的是引用,而不是值。→P381
★71:原始变量作为参数传递给函数时,函数内对数据的任何操作都不会影响原来的变量,而复合变量则会受到影响。→P382
★72:影片剪辑和对象在播放器中的实现是不同的,相互分开的,主要原因是它们被分配和解除分配的方式不同!→P397
★73:被旋转或遮盖的文本域内容不会显示在屏幕上,除非它的字体是嵌入的。→P437
★74:scroll属性表示当前显示在文本域中最顶端的行数。→P438
★75:未定义的文本域出现在屏幕上,但包含的值为undefined不会被for-in语句列举出来。→P450
★分母为0时:
→若分子为0或非数字串,则结果为NaN:
trace(0/0); //NaN
trace("a"/0); //NaN
→若分子为正数,则结果为Infinity:
trace(1/0); //Infinity
→若分子为负数,则结果为-Infinity:
trace(-1/0); //-Infinity
★ 分子为Infinity时:
→若分母为Infinity,-Infinity,则结果为NaN:
trace(Infinity/Infinity); //NaN
trace(Infinity/-Infinity); //NaN
→若分母为0、有限正数或非数字串,则结果为Infinity:
trace(Infinity/0); //Infinity
trace(Infinity/1); //Infinity
trace(Infinity/10000); //Infinity
trace(Infinity/"a"); //Infinity
→若分母为负有限数,则结果为-Infinity:
trace(Infinity/-100); //-Infinity
★分子为-Infinity时:结果跟Infinity相反。
★分母为Infinity时:
→若分子为数字,则结果为0:
trace(0/Infinity); //0
trace(1/Infinity); //0
trace(-23/Infinity); //0
→若分子为非数字串,则结果为NaN:
trace("sdf"/Infinity); //NaN
★注意:如果分子分母中有数字串,则此串会被转换成相应的数字再进行运算:
trace("1"/0); //NaN
trace(Infinity/"8"); //Infinity
trace(Infinity/"-8"); //-Infinity
trace("-23"/Infinity); //"23"会先转换成23,结果还是0
→参考《ActionScript权威指南》第132页
阅读(1297) | 评论(0) | 转发(0) |