关于ActionScript中 那些你不知道的事情

Christophe Herreman @herrodius

翻译:二翻队 Shinji

转自:http://bbs.wefdc.com/thread-1540-1-1.html

探索ActionScript3语言,我们将会发现一些前所未见的,指不定哪天就会用到新东西。又或者你可能会突然惊叫一声“我X!”——搞得在座看官们还以为我XJJ露出来了——但其实你只是看到了一段你觉得挺非主流的ActionScript代码随后疑惑焦虑惊叹羡慕嫉妒恨别人居然是这么用API的,换句话说你
觉得原先用着挺别扭的AS语句现在突然变得好用甚至有趣了,其实很显然ActionScript本身还是又酷又强大的!

  1 一、运算符
  2 1、等于 "=="
  3 比较2个值是否相等,当被比较的值类型不同时自动进行转换
  4 "hello" == "hello" // true
  5 "5" == 5 // true
  6 true == 1 // true
  7 false == 0 // true
  8 "true" == true // false
  9 null == undefined // true
 10 
 11 2、严格等于 "==="
 12 比较2个数据的值和数据类型是否都相等
 13 "hello" === "hello" // true
 14 "5" === 5 // compile error
 15 true === 1 // false
 16 false === 0 // false
 17 "true" === true // false
 18 
 19 3、等于 "=="
 20 复杂数据类型将基于引用而非值进行比较
 21 var a:Array = [1, 2, 3];
 22 var b:Array = [1, 2, 3];
 23 a == b // false
 24 var c:Array = a;
 25 a == c // true
 26 null === undefined // false
 27 
 28 4、条件 "?"
 29 又叫“三元”运算符
 30 var result:Boolean = (a > b) ? x : y;
 31 // 上面这句可以用来替代以下代码,神奇不?
 32 var result:Boolean;
 33 if (a > b) {
 34     result = x;
 35 } else {
 36     result = y;
 37 }
 38 
 39 5、逻辑或 "||="
 40 function (a:Object) {
 41     a ||= new Object();
 42 }
 43 function (a:Object) {
 44     if (a === null) {
 45         a = new Object();
 46     }
 47 }
 48 
 49 6、逻辑与 "&&="
 50 function toHTMLTag (s:String) {
 51     s &&= "<" + s + ">";
 52     return s;
 53 }
 54 function toHTMLTag (s:String) {
 55     if (s !== null && (s.length > 0))
 56         s = "<" + s + ">";
 57     return s;
 58 }
 59 7、"as"
 60 转换一个值的数据类型,如果转换失败则返回null
 61 "hello" as String // "hello"
 62 5 as String // null
 63 true as MyClass // null
 64 String("hello") // "hello"
 65 String(5) // "5"
 66 
 67 8、"is" vs "instanceof"
 68 检查一个值的数据类型
 69 var s:Sprite = new Sprite();
 70 s is Sprite // true
 71 s is DisplayObject // true
 72 s is IEventDispatcher // true
 73 s instanceof Sprite // true
 74 s instanceof DisplayObject // true
 75 s instanceof IEventDispatcher // false
 76 MyClass(true) // Runtime Error
 77 
 78 9、检查一个对象的命名空间
 79 "::" 名称限定符
 80 public namespace Dutch;
 81 public namespace French;
 82 Dutch function hello():String {
 83     return "hallo";
 84 }
 85 French function hello():String {
 86     return "bonjour";
 87 }
 88 Dutch::hello() // "hallo"
 89 French::hello() // "bonjour"
 90 
 91 10、"::" 名称限定符
 92 这些也都是命名空间
 93 "public", "private", "protected", "internal"
 94 public function get a():String;
 95 private function set a(value:String);
 96 trace(a)
 97 a = "hello"
 98 trace(public::a)
 99 private::a = "hello"
100 
101 11、"in" vs Object.hasOwnProperty
102 检查一个对象是否带有指定属性
103 "CASEINSENSITIVE" in Array // true //CASEINSENSITIVE大小写敏感排序
104 "CASEINSENSITIVE" in [] // false
105 "length" in Array // true
106 "length" in [] // true
107 [].hasOwnProperty("CASEINSENSITIVE") // false
108 [].hasOwnProperty("length") // true
109 
110 12、"arguments"
111 一个带有所有传递进来的参数的数组,任何方法中都可用
112 function myFunction (x:int) {
113     for(var i:uint=0; i<arguments.length; i++){
114         trace(arguments[i]);
115     }
116 }
117 myFunction(1, 2, 3);
118 // 1
119 // 2
120 // 3
121 
122 13、"..." rest 参数
123 表示接收任意数量的参数
124 function myFunction (x:int, ... rest) {
125     for (var i:uint = 0; i< rest.length; i++) {
126         trace(rest[i]);
127     }
128 }
129 myFunction(1, 2, 3);
130 // 2
131 // 3
132 
133 二、提示与技巧
134 
135 1、创建对象
136 var a:Array = new Array();
137 var a:Array = [];
138 var o:Object = new Object();
139 var o:Object = {};
140 var v:Vector.<String> = new Vector.<String>();
141 v.push("a");
142 v.push("b");
143 var v:Vector.<String> = new <String>["a", "b"];
144 
145 2、引用对象
146 var a:Object = {};
147 a.name = "John";
148 var b:Object = a;
149 b.name = "Elvis";
150 trace(a.name);// 输出为 "Elvis"
151 
152 3、对象复制
153 基于场景创建深表复制和浅表复制
154 // 深表复制
155 private function clone(obj:Object):Object {
156     var bytes:ByteArray = new ByteArray();
157     bytes.writeObject(obj);
158     bytes.position = 0;
159     return bytes.readObject();
160 }
161 
162 4、事件
163 始终覆写事件子类的"clone"方法,以防止重调时发生
164 强制转换错误
165 class MyEvent extends Event {
166     public function MyEvent(data:Object){
167         _data = data;
168     }
169     override public function clone():Event {
170         return new MyEvent(_data);
171     }
172 }
173 
174 5、clone函数
175 var a:Point = new Point(10,20);
176 var b:Point = a;
177 b.x = 100;
178 
179 trace("a.x = "+a.x);
180 trace("b.x = "+b.x);
181 //a.x = 100
182 //b.x = 100
183 
184 var c:Point = new Point(10,20);
185 var d:Point = c.clone();
186 d.x = 100;
187 trace("c.x = "+c.x);
188 trace("d.x = "+d.x);
189 //c.x = 10
190 //d.x = 100
191 
192 6、for...in vs. for each...in
193 var arr:Array = ["a", "b", "c"];
194 for ( var i in arr ) {// 基于键[0]、[1]、[2]的循环
195     trace( i );//分别输出:0,1,2
196 }
197 for each ( var s:String in arr ) {// 基于值"a"、"b"、"c"的循环
198     trace( s );//分别输出:a,b,c
199 }
200 懂了吧:顺序不靠谱,结合计数器使用for循环
201 
202 与for...in循环不同的是,for each...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键、索引)
203 var king:Object={name:"zjh",age:24,school:"cug"};
204 for (var i in king){
205     trace("成员名(键):"+i+"\t成员(值):"+king[i]);
206 }
207 //成员名(键):school    成员(值):cug
208 //成员名(键):name    成员(值):zjh
209 //成员名(键):age        成员(值):24
210 for each (var j in king){
211     trace("成员(值):"+j);
212 }
213 //成员(值):cug
214 //成员(值):zjh
215 //成员(值):24
216 
217 7、trace()
218 trace()可以接受多个参数,没必要硬凑成一个字符串去trace
219 trace(new Date(2012, 4, 22), "Aloha", Math.PI, true);// Tue May 22 00:00:00 GMT+0200 2012 Aloha 3.141592653589793 true
220 
221 8、循环标签
222 给循环贴上标签命名,在需要从嵌套循环中跳出时很有用
223 for (var i:uint = 0; i<10; i++) {
224     for (var j:uint = 0; j<10; j++)
225     {
226         if (i == 5 && j == 7) 
227         {
228             break mainLoop;
229         }
230     }
231 }
232 
233 9、全局函数
234 新建一个as文件,只申明一个与文件名相同命名的函数
235 // 文件名: myGlobalFunction.as
236 package {
237     function myGlobalFunction():void {
238         trace("in myGlobalFunction");
239     }
240 }
241 
242 10、为内建类添加方法
243 通过使用prototype在继承内建类特性的同时加入新方法
244 Array.prototype.removeItem = function (item:*):void {
245     var index:int = this.indexOf(item);
246     if (index > -1) {
247         this.splice(index, 1);
248     }
249 };
250 var a:Array = [1, 2, 3];
251 a.removeItem(2);
252 trace(a); // 1, 3
253 
254 11、显式转换
255 var o:MyObject = new MyObject();
256 var o1:MyObject = MyObject(o);
257 var o2:MyObject = o as MyObject; // o1 === o2
258 var a:Array = [1, 2, 3];
259 var a1:Array = Array(a);// 新数组!!
260 var a2:Array = a as Array; // a1 !== a2
261 操作Date和Error类时也适用,要注意!
262 
263 12、Boolean的显式转换法
264 Boolean(true) // true
265 Boolean(false) // false
266 Boolean(0) // false
267 Boolean(1) // true
268 Boolean(-1) // true
269 Boolean("true") // true
270 Boolean("false") // true
271 Boolean("") // false
272 Boolean(" ") // true
273 Boolean("0") // true
274 Boolean("1") // true
275 Boolean(null) // false
276 Boolean(undefined) // false
277 Boolean(Object) // true
278 Boolean({}) // true
279 
280 13、Array 类
281 var a:Array = new Array();// 空数组
282 var a:Array = [];// 空数组
283 var a:Array = new Array(10);// 长度为10的数组
284 var a:Array = [10];// 带有1个元素10的数组
285 var a:Array = new Array(1, 2, 3);// 带有1、2、3三个值的数组
286 var a:Array = [1, 2, 3];// 带有1、2、3三个值的数组
287 
288 14、Date 类
289 new Date();
290 new Date(2012); // 01/01/1970 01:00:
291 02
292 new Date(2012, 1); // 01/02/2012 00:00:00
293 new Date(2012, 1, 1); // 01/02/2012 00:00:00
294 public function Date(
295     yearOrTimevalue:Object,
296     month:Number, // 0 to 11
297     date:Number = 1, // 1 to 31
298     hour:Number = 0, // 0 to 23
299     minute:Number = 0, // 0 to 59
300     second:Number = 0, // 0 to 59
301     millisecond:Number = 0) // 0 to 999
302 
303 15、抛出
304 除了错误还有其他东西可以抛出
305 class AwesomeParty {}
306 
307 try {
308     throw new AwesomeParty();(鬼知道啥意思)
309 } catch (party:AwesomeParty) {
310     // go loose at moNo!
311 }
312 实用不?
posted @ 2012-05-29 19:31  logzh  阅读(308)  评论(0编辑  收藏  举报