AS3 if 判斷的陷阱

2021-08-26 16:00:52 字數 2803 閱讀 5826

as3 if 判斷的陷阱

2023年07月01日

[b]陷阱一: 判斷xml中是否有某個字段 [/b]

陷阱case: var xml:xml = ;

if ( xml.somenotexistfield )

解決方法:

if( xml.somenotexistfield != undefined ){}

問題分析:

感覺as3編譯器, 對於 左值和 右值 沒有完全區分開.

a=b; 這種情況 a為左值, b為右值. 常見語言的語法左值a會改變, 而右值b是唯讀的. 針對 上面的case

將 xml.somenotexistfield 放在 if 語句內作判斷應該是右值, 不應該建立乙個新的xmllist

只有 xml.somenotexistfield=; 做左值時, 自動建立乙個新的xmllist才是合理的 [b] [/b][b] 陷阱二: 判斷function是否已經賦值 [/b]

陷阱case: var afunc:function = testfunc;//testfunc是乙個已經宣告並且實現的函式, 略去

if( afunc != null )

解決方法:

if( afunc is function ){} //這樣就行了

或是將flex sdk公升級到 4.5.1 重新編譯**後,(target設定為 >=10.1, flex4.5.1 default target是10.2) 再執行

if( afunc != null ){} 就是 true了

問題分析:

as3編譯器,將 afunc != null 解釋為: afunc() != null, 就是說沒有括號也算是函式呼叫.

感覺as3編譯器細節處還在動態語言特性和強資料型別之間游離! 沒有()就應該不能算是呼叫函式呀!!

可喜的是: 最新的flexsdk4.5.1中的compc已經將這個問題改正了 [b] [/b][b] 陷阱三: 中括號會引起執行時錯誤 [/b]

陷阱case: var myobj:myclass = new myclass();//myclass是乙個自定義的類

if ( myobj["somenotexistfield"] ){} //因為myobj.somenotexistfield會在編譯時就會報錯, 不考慮那種情況

這個判斷會丟擲: referenceerror: error #1069

解決方法:

對於myclass這種靜態類, 還是不要用這種形式, 如果直接是乙個object物件就可以了, 因為object是乙個動態類

問題分析:

我不得不再次說as3有點怪, object類是乙個動態類, 但是如果你 class myclass extends object, 這個myclass卻不是動態類! 如果想宣告動態類,需要用 dynamic class. 不過adobe不推薦你自定義動態類, 因為有效能問題. 我想可能adobe對object這個類的動態性做了優化吧!

[b] 陷阱四: string和boolean的轉換 [/b]

陷阱case: var strboolean:string = "false";

if (strboolean)

if (new boolean(""))

if (new boolean("false"))

if (boolean("false"))

if ("true" as boolean)

解決方法:

var somestr:string = ***xx;

if( "true" == somestr ){} 或是

if( "false" != somestr ){}

問題分析:

as3的boolean構造其實不認string的 "true" 和 "false", 只認 "", 和非"". [b] [/b][b] 陷阱五: string的邏輯判斷需要注意 空字串 [/b]

陷阱case:

private function test(s:string):void

} var str:string;

test(str);

str = null;

test(str);

str=""; //空字串, 在業務上也是可能出現的

test(str);

str="hello"

test(str);//只有這個會 true

解決方法:

private function test(s:string):void

} 問題分析:

這個和陷阱四本質上是一回事 [b] [/b][b] 陷阱六: xml中的true和false [/b]

陷阱case: var xml:xml = false;

trace("getqualifiedclassname(xml.f)="+getqualified classname(xml.f));//print xmllist

trace(xml.f);//print false

var v:boolean = xml.f;

trace("v=" + v);//此處print為false,實為湊巧

if (xml.f)

解決方法:

if( "true" == xml.f ){} 或是

if( "false" != xml.f ){}

問題分析:

xml.f 本質是乙個xmllist, 無從談起 邏輯, xml內容的本質都是string.

因為業務邏輯的判斷只關心 "true" 或是 "false".

AS3 if 判斷的陷阱

as3 if 判斷的陷阱 2011年07月01日 b 陷阱一 判斷xml中是否有某個字段 b 陷阱case var xml xml if xml.somenotexistfield 解決方法 if xml.somenotexistfield undefined 問題分析 感覺as3編譯器,對於 左值...

bool判斷中的「!」陷阱

在使用bool表示式中 非 的語法時,我們常常不自覺的陷入一些表面上看似無懈可擊,但實際執行結果卻不是我們想要的糟糕情況。這往往是因為想當然的邏輯錯誤,當然罪魁禍首還是 這個符號!使用它常常會讓我們無意識的犯這些錯誤!很多人的觀點在英語中not會使一件事情變的不容易明白。同樣地,not 操作符!也會...

C 判斷物件相等的陷阱

請看下面的測試 object a 11 object b 11 console.writeline a b 輸出false 實際開發過程中,可能不會這麼直觀,例如如下場景,我們要查詢datarow中的字段是否相等,你可能會這樣寫 datarow hbrow needaddrows.where p p...