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...