1. 程式人生 > >關於ActionScript中那些你不知道的事情

關於ActionScript中那些你不知道的事情

探索ActionScript3語言,我們將會發現一些前所未見的,指不定哪天就會用到新東西。又或者你可能會突然驚叫一聲“我X!”——搞得在座看官們還以為我XJJ露出來了——但其實你只是看到了一段你覺得挺非主流的ActionScript程式碼隨後疑惑焦慮驚歎羨慕嫉妒恨別人居然是這麼用API的,換句話說你覺得原先用著挺彆扭的AS語句現在突然變得好用甚至有趣了,其實很顯然ActionScript本身還是又酷又強大的!

運算子

等於 “==”
比較2個值是否相等,當被比較的值型別不同時自動進行轉換
"hello" == "hello" // true
"5" == 5 // true
true == 1 // true
false == 0 // true
"true" == true // false
null == undefined // true

複雜資料型別將基於引用而非值進行比較
var a:Array = [1, 2, 3];
var b:Array = [1, 2, 3];
a == b // false
var c:Array = a;
a == c // true

嚴格等於 “===”
比較2個數據的值和資料型別是否都相等
"hello" === "hello" // true
"5" === 5 // compile error
true === 1 // false
false === 0 // false
"true" === true // false
null === undefined // false

條件 “?”
又叫“三元”運算子
var result:Boolean = (a > b) ? x : y;
// 上面這句可以用來替代以下程式碼,神奇不?
var result:Boolean;
if (a > b) {
result = x;
} else {
result = y;
}

邏輯或 “||=”
function (a:Object) {
a ||= new Object();
}
// 上面的程式碼和下面的程式碼作用是一樣的,神奇不?
function (a:Object) {
if (a === null) {
a = new Object();
}
}

邏輯與 “&&=”
function toHTMLTag (s:String) {
s &&= " return s;
}
// 上面的程式碼和下面的程式碼作用是一樣的,神奇不?
function toHTMLTag (s:String) {
if (s !== null && (s.length > 0))
s = " return s;
}

“as”
轉換一個值的資料型別,如果轉換失敗則返回null
"hello" as String // "hello"
5 as String // null
true as MyClass // null
String("hello") // "hello"
String(5) // "5"
MyClass(true) // Runtime Error

“is” vs “instanceof”
檢查一個值的資料型別
var s:Sprite = new Sprite();

s is Sprite // true
s is DisplayObject // true
s is IEventDispatcher // true

s instanceof Sprite // true
s instanceof DisplayObject // true
s instanceof IEventDispatcher // false

“::” 名稱限定符
檢查一個物件的名稱空間
public namespace Dutch;
public namespace French;

Dutch function hello():String {
return “hallo”;
}

French function hello():String {
return “bonjour”;
}

Dutch::hello() // “hallo”
French::hello() // “bonjour”

“public”, “private”, “protected”, “internal” 這些也都是名稱空間
public function get a():String;
private function set a(value:String);

trace(a) // 編譯錯誤
a = “hello” // 編譯錯誤

trace(public::a)
private::a = “hello”

“in” vs Object.hasOwnProperty
檢查一個物件是否帶有指定屬性
"CASEINSENSITIVE" in Array // true
"CASEINSENSITIVE" in [] // false
"length" in Array // true
"length" in [] // true

[].hasOwnProperty(“CASEINSENSITIVE”) // false
[].hasOwnProperty(“length”) // true

“arguments”
一個帶有所有傳遞進來的引數的陣列,任何方法中都可用
function myFunction (x:int) {
for(var i:uint=0; i trace(arguments[i]);
}
}
myFunction(1, 2, 3);
// 1
// 2
// 3

“…” rest 引數
表示接收任意數量的引數
function myFunction (x:int, ... rest) {
for (var i:uint = 0; i< rest.length; i++) {
trace(rest[i]);
}
}

myFunction(1, 2, 3);
// 2
// 3

提示與技巧

建立物件
var a:Array = new Array();
var a:Array = []; //這樣更快

var o:Object = new Object();
var o:Object = {}; //這樣更快

var v:Vector.= new Vector.();
v.push(“a”);
v.push(“b”);

var v:Vector.= new["a", "b"];

引用物件
var a:Object = {};
a.name = "John";

var b:Object = a;
b.name = “Elvis”;

trace(a.name);
// 輸出為 “Elvis”

物件複製
基於場景建立深表複製和淺表複製

// 深表複製
private function clone(obj:Object):Object {
var bytes:ByteArray = new ByteArray();
bytes.writeObject(obj);
bytes.position = 0;
return bytes.readObject();
}

事件
始終覆寫事件子類的”clone”方法,以防止重調時發生強制轉換錯誤
class MyEvent extends Event {
public function MyEvent(data:Object){
_data = data;
}
override public function clone():Event {
return new MyEvent(_data);
}
}

for…in vs. for each…in
// 基於鍵[0]、[1]、[2]的迴圈
var arr:Array = ["a", "b", "c"];
for ( var i in arr ) {
trace( i );
}
// 基於值"a"、"b"、"c"的迴圈
for each ( var s:String in arr ) {
trace( s );
}

懂了吧:順序不靠譜,結合計數器使用for迴圈

trace()
trace()可以接受多個引數,沒必要硬湊成一個字串去trace
trace(new Date(2012, 4, 22), "Aloha", Math.PI, true);
// Tue May 22 00:00:00 GMT+0200 2012 Aloha 3.141592653589793 true

迴圈標籤
給迴圈貼上標籤命名,在需要從巢狀迴圈中跳出時很有用
mainLoop:
for (var i:uint = 0; i for (var j:uint = 0; j if (i == 5 && j == 7) {
break mainLoop;
}
}
}

全域性函式
新建一個as檔案,只申明一個與檔名相同命名的函式
// 檔名: myGlobalFunction.as
package {
function myGlobalFunction():void {
trace("in myGlobalFunction");
}
}

為內建類新增方法
通過使用prototype在繼承內建類特性的同時加入新方法
Array.prototype.removeItem = function (item:*):void {
var index:int = this.indexOf(item);
if (index > -1) {
this.splice(index, 1);
}
};

var a:Array = [1, 2, 3];
a.removeItem(2);
trace(a); // 1, 3

“懂了!” & “我X!”

顯式轉換
var o:MyObject = new MyObject();
var o1:MyObject = MyObject(o);
var o2:MyObject = o as MyObject;// o1 === o2

var a:Array = [1, 2, 3];
var a1:Array = Array(a); // 新陣列!!
var a2:Array = a as Array; // a1 !== a2
操作Date和Error類時也適用,要注意!

Boolean的顯式轉換法
Boolean(true) // true
Boolean(false) // false
Boolean(0) // false
Boolean(1) // true
Boolean(-1) // true
Boolean("true") // true
Boolean("false") // true
Boolean("") // false
Boolean(" ") // true
Boolean("0") // true
Boolean("1") // true
Boolean(null) // false
Boolean(undefined) // false
Boolean(Object) // true
Boolean({}) // true

Array 類
var a:Array = new Array(); // 空陣列
var a:Array = []; // 空陣列
var a:Array = new Array(10); // 長度為10的陣列
var a:Array = [10]; // 帶有1個元素10的陣列

var a:Array = new Array(1, 2, 3); // 帶有1、2、3三個值的陣列
var a:Array = [1, 2, 3]; // 帶有1、2、3三個值的陣列

Date 類
new Date(); // 當前日期
new Date(2012); // 01/01/1970 01:00:02
new Date(2012, 1); // 01/02/2012 00:00:00
new Date(2012, 1, 1); // 01/02/2012 00:00:00

public function Date(
yearOrTimevalue:Object,
month:Number, // 0 to 11
date:Number = 1, // 1 to 31
hour:Number = 0, // 0 to 23
minute:Number = 0, // 0 to 59
second:Number = 0, // 0 to 59
millisecond:Number = 0) // 0 to 999

丟擲
除了錯誤還有其他東西可以丟擲
class AwesomeParty {}

try {
throw new AwesomeParty();
} catch (party:AwesomeParty) {
// go loose at moNo!(鬼知道啥意思)
}
實用不?