关于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 实用不?