FLASH變數和資料類型

來源:互聯網
上載者:User
變數|資料|資料類型
  變數是什麼? 大概說來就是存放資訊的容器(更確切的說是指向記憶體空間中某個存貯位置的指標, 不過能夠理解就行了, 何必去記這麼抽象的定義). 只要能夠理解它可以存放資訊並可以通過各種途徑改變其中的資訊就可以了, 我又不是大學裡面的老師, 整天就知道叫學生死記硬背定義, 實際的東西一點都沒有, "一切為了考試".
還有一個概念: 什麼叫初始設定變數? 就是在定義時給它一個有效值以說明它的內容和資料類型. 就像下面的例子, 定義了一個字串(String)變數:
MyString = "我不懂什麼是初始設定變數";
就這麼簡單, 但是也有要注意的問題:
變數名必須為有效標識符(例如不能以數字和不允許使用的字元開頭).
變數名不能與 Actions cript 關鍵字和常量相似或相同.
變數名在它的範圍(Scope)中必須是唯一的(在下面我們會提到什麼是範圍).
變數範圍
也就是變數在什麼範圍內是可以訪問的. 就好像在 C&C: Renegade 中的任務一樣, 沒有 Security Level 3 的 ID Card 就進不了安全層級為 3 的地區的.
範圍一般說來有三種: 時間軸(Timeline), 局部(Local), 全域(Global).

--------------------------------------------------------------------------------
對於時間軸範圍的變數, 就像上面的例子一樣用 = 賦值並聲明, 當然你也可以用 set 動作(Flash 4, 不推薦使用的方法, 除非你覺得代碼不夠長):
set( MyString, "我不懂什麼是初始設定變數" );
時間軸範圍變數聲明後, 在聲明它的整個層級(Level)的時間軸內它是可訪問的.

--------------------------------------------------------------------------------
什麼是局部變數? 我也常常問自己. 局部變數就是在聲明它的語句塊內(例如一個函數體)是可訪問的變數, 通常是為避免衝突和節省記憶體佔用而使用.
聲明它可以使用 var 關鍵字:
function LocalVar(){
var MyLocalString = "這是一個局部字串變數";
trace( "Inside: " + MyLocalString );
}
LocalVar();
trace( "Outside: " + MyLocalString );
上面的 MyLocalString 字串變數在函數尾就會被自動清除出記憶體. 所以在外面的 trace 語句返回結果為空白("Outside:"), 而函數體內的 trace 返回:"Inside: 這是一個局部字串變數".
假如你刪除了 var 關鍵字, 那麼 MyLocalString 就成時間軸範圍的變數了. 運行後顯示 Inside 和 Outside 都為 "這是一個局部字串變數". 在後面的函數一章我們還會提到局部變數的內容.
也許你注意到了函數中有一個 trace 動作. 它可以在測試模式(Testing Movie, CTRL+ENTER 按鍵組合)下把指定變數的值發送到輸出視窗(Output Window), 以便在運行時檢查處理變數的代碼是否正常. 這是一個非常方便的檢查方法, 在測試代碼時經常使用.
在代碼中如果遇到有不清楚的函數和關鍵字, 可以通過 Action 面板的參考按鈕(Reference)開啟參考面板顯示光線標所在位置關鍵字或內建函數以及對象的詳細資料, 也可以通過按鍵組合 SHIFT+F1 開啟它. 下面是參考面板:
全域變數, 顧名思義就是在整個 Movie 中都可以訪問的變數. 它的聲明比較特殊:
_global.MyGlobalString = "這是一個全域字串變數";
聲明使用了一個 _global 標識符和點文法(Dot Syntax, 將在後面的章節討論). _global 標識符是在 Flash 6 中新增加的, 用於建立全域變數, 函數, 對象和類(Class, 不清楚類是什麼的話可以看看 C++ 的書).
總的來說 _global 是一個與最底層 _level0 並列的對象. 所有的全域變數, 函數, 對象其實就相當於是它的屬性, 方法, 子物件. 關於它的具體內容可以查閱協助檔案, 一般我們只要懂得用就行了.
全域變數會被同名的時間軸變數和局部變數屏蔽(Obscured), 這時我們就要通過別的方式來訪問它了. 看看下面的例子:
//定義全域變數
_global.x = "Global";
//一個簡單的函數
function show() {
trace("沒有局部變數時函數內: "+x);
var x = "Local";
trace("有局部變數時函數內: "+x);
trace("有局部變數時調用時間軸變數: "+this.x);
}
//測試
trace("------沒有時間軸範圍變數時------");
show();
trace("直接調用: "+x);
//設定時間軸變數
x = "Timeline";
//測試
trace("-------有時間軸範圍變數時-------");
show();
trace("直接調用: "+x);
trace("有時間軸範圍變數時調用全域變數: "+_global.x);
由上例的結果可以看出, 在目前時間線範圍內有和全域變數同名的變數時, 直接通過變數名只能訪問時間軸範圍內的同名變數, 這時應該用 _global.變數名 來調用全域變數. 同樣局部變數也會屏蔽時間軸變數(這時可以用 this.變數名 來調用時間軸變數)和全域變數(這時可以用 _global.變數名 來調用全域變數).
在代碼中使用變數
使用變數很簡單, 有點編程基礎的讀者都可以辦到. 下面用一個例子來說明在 Actions cript 中變數的使用:
function vars(x){
if(x<5){ //如果 x 小於 1
x = x + 1; //x 加 1
} else {
x = 10; //否則賦值 10
}
trace("x="+x);
return x;
}
vars(2);
vars(6);
trace("x="+x); //測試 x 是否為局部變數
函式宣告中的參數無需加 var 聲明也自動作為局部變數(例如上面例子中的 x). 通過上面例子的最後一句就可以看出來(傳回值為空白).
我們可以看到, 上面定義的函數中對局部變數 x (在函數參數中聲明)進行了 4 種操作:
賦值: 就是改變變數所存貯的內容.
運算: 使用運算子運算並返回結果. 上例中的 x = x + 1 可視為一個運算操作(x + 1)和一個賦值操作(x = ...)的複合陳述式. 對於邏輯運算(上面 if 語句的條件), 返回的為邏輯值 true 或 false(就像 x<5 在 x 為 4 時會返回 true).
函數及命令調用: 就如上面 trace("x="+x); 中的一樣, x 是被作為參數傳遞給函數的, 它代表的是它所存貯的實際內容(在 return x; 中也一樣).
在 Actions cript 中變數的使用具有很大的靈活性, 下面我們將會針對不同的資料類型進行講解.
常見資料類型---字串 | String
一個字串就是一系列的字元, 例如 "This" 就是一個字串.
定義一個字串變數很簡單, 只要在初始化時將一個字串資料賦給它就行了:
chapter = "第 2 章";
section = "第 2 節";
section_name = "常見資料類型";
full_name = section + " " add section_name + 999; //連接字串
if(typeof(full_name) ne "string"){
full_name = "類型錯誤!";
}
trace("full_name=" + full_name);
上面的第 4 行的 full_name 的值是前面兩個變數(section 和 section_name)和一個常量(999)的運算結果(使用了 + 和 add 運算子, 它們的功能是相同的). 請注意, 這行代碼最後面的數值常量 999 不是同一類型的資料, 如果在 Pascal 這種資料類型檢查極其嚴格的語言中這行代碼是錯誤的. 但是 Actions cript 可以自動將它轉換為字串格式, 而不需要專門的函數(當然, 最安全的方法是使用 Number 對象的 toString() 函數或是 String() 函數). 由此可見, Actions cript 是一種弱類型檢查的語言(即不嚴格限制各種資料類型間的運算和傳遞), 這和 VB 倒是有點相似, 只不過更過分一點.
在後面我用了一個 if 語句來測試後面加上 999 的代碼是否運行正常(即檢查運算式返回的值是否為字串, 儘管在實際中並沒有這個必要). 注意我用的是字串類型專用的邏輯運算子 ne, 當然這隻是為了表現字串資料型別的特殊性, 實際應用中用 != 也就可以了. 對於 typeof 操作符, 我們會在這一章的末尾詳細講解.<!-- / message --><!-- sig -->
<!-- / icon and title --><!-- message --> --------------------------------------------------------------------------------
在實際應用中, 有一些特殊的字元不能直接輸入在字串中, 例如不能在字串中直接輸入引號(會破壞字串的完整性). 這時我們就需要用到逸出字元了(Escaping). 要使用逸出字元, 首先要輸入一個反斜線(\), 然後輸入相應的代碼. 詳細的代碼清單如下:
逸出字元 代表字元
\b 退格字元 (ASCII 8)
\f 換頁符 (ASCII 12)
\n 分行符號 (ASCII 10)
\r 斷行符號符 (ASCII 13)
\t 定位字元 (ASCII 9)
\" 雙引號字元
\'' 單引號字元
\\ 反斜線字元
\000 - \377 八進位表示的字元
\x00 - \xFF 十六進位表示的字元
\u0000 - \uFFFF 十六進位表示的 16 位 Unicode 字元

例如:
trace("He said:\"I don\''t care about you.\"\nAnd she smiled:\"Really?\"");
你可以根據上面的對照列表讀出上面代碼的字串內的實際內容. 運行後的輸出為:
He said:"I don''t care about you."
And she smiled:"Really?"
可以看到, 逸出字元都被轉換為相應的實際字元了. 這就是逸出字元的作用, 學過 C++ 的讀者應該很熟悉了.
數值 | Number
Actions cript 中的數值型資料為雙精確度浮點數(不懂是什麼意思也沒關係, 反正知道是數值就行了, 那隻不過是個範圍限制).
對數值型資料可以進行任何相應操作. 如下例:
a = 1;
b = 2;
sum = a + b; //求 a, b 之和
if(sum>0){ //假如結果大於 0
square_root = Math.sqrt(sum); //使用 Math 對象的平方根函數求 sum 的平方根
}
trace("sum=" + sum);
trace("square_root=" + square_root);
完.
邏輯變數 | Boolean
邏輯變數又被稱為布爾變數(由其英文名稱而來). 它只有兩個值: true 和 false. 在必要的情況下, Actions cript 會自動將它的值轉換為 1 和 0, 你也可以用 1 和 0 給它賦值(這是可能是為了和 Windows API 函數調用相容而產生的).
a = 10;
b1 = 1;
b2 = false;
if(b1 == true){
a = a + b1;
} else {
b2 = !b2;
}
trace("a=" + a);
trace("b1=" + b1);
trace("b2=" + b2);
上面代碼混合了數值型和邏輯型變數的運算. a = a + b1 將邏輯值 b1(true 即 1)加到 a 上, b2 = !b2 則是對 b2 取反(即由 false 變為 true 或是由 true 變為 false, 因為邏輯值只有兩種情況: 真或假). 你可以試著修改一下 b1 的值來看看不同的效果.
對象 | Object
對象是 Actions cript 中的一個重要資料類型. 說得更清楚一些, 它就是現在大多數程式設計語言中的類(Class). 其實在 Flash 中使用的 MovieClip 其實也屬於一種預定義的類, 只不過它有些特殊而已.
關於對象我們會在後面章節詳細介紹
影片 | Movieclip
影片是 Flash 中唯一用來引用映像元素的資料類型. 你可以通過 MovieClip 對象的各種屬性(Property)和方法(Method)來操作它的執行個體(Instance).
關於影片我們也會在後面詳細講解
空 | Null
空? 我是說"空", 也就是什麼都沒有. 這種資料類型就是這個意思, 而且它只有一個值: null. 那麼它有什麼用呢?
用來表示一個變數尚未賦值
用來表示一個變數已經不包含資料
用來表示一個函數沒有傳回值
用來表示一個函數的某個參數被省略了
不要認為它毫無意義, 在涉及到具體的程式問題時它是非常有用的.
定義 | Undefined
未定義類型同 Null 差不多, 也只有一個值: undefined.
它被用來表示一個變數尚未賦值.
typeof 操作符

在實際應用中我們經常遇到需要判斷具體變數和對象的資料類型的情況. Flash 提供了一個很好用的 typeof 來解決這個問題. 特別是對於自訂函數的設計, 確定參數的類型是非常重要的步驟.
參數類型 傳回值(字串)
String string
MovieClip movieclip
Button object
TextField object
Number number
Boolean boolean
Object object
Function function
Undefined undefined
Null null

typeof 操作符的優先順序很高, 可以在邏輯運算或是算術運算子之前被運算. 下面是它具體應用的例子:
//常數的類型
trace("數值常數 36 的類型: "+typeof 26);
trace("字串常數 what 的類型: "+typeof "what");
//一般 typeof 操作符可以像 +, -, add 等操作符一樣使用
//但為了避免出錯還是建議你使用括弧, 如下例
trace("邏輯常數 true 的類型: "+typeof(true));
//對象的類型
trace("對象 Object() 的類型: "+typeof (Object()));
trace("new String() 的類型: "+typeof new String()); //注意 new 操作符優先順序比 typeof 高
//函數的方法的類型取決於其傳回值
trace("Math.sqrt() 方法的類型: "+typeof Math.sqrt());
trace("Math.toString() 方法的類型: "+typeof Math.toString());
//null 空類型
trace("null 的類型: "+typeof null);
//在這裡我用了多級 typeof 來看看 typeof 返回的值的類型
trace("typeof 傳回值的類型: "+typeof (typeof null));
你還可以自己試著改動一下代碼, 看看其它東西的 typeof 是什麼.
這一章就到此為止了, 下一章會比較現實一點(因為有人說前面這些東西根本沒必要講, 不切實際). 對於資料類型的對象性方面的內容將在對象部分中介紹
                                   來源: 閃吧


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。