AS3各种判断陷阱......以及处理方法
2011年11月02日
陷阱一: 判断xml中是否有某个字段
陷阱case:
var xml:XML = ;
if ( xml.someNOTExistField ) { //这个居然也为真!! 要知道someNOTExistField 这个是没有定义的
//下面的trace显示, xml.someNOTExistField 是一个 XMLList类型
trace("xml.someNOTExistField class="+getQualifiedClassName(xml.someNOTExistField));
}
解决方法:
if( xml.someNOTExistField != undefined ){}
问题分析:
感觉AS3编译器, 对于 左值和 右值 没有完全区分开.
a=b; 这种情况 a为左值, b为右值. 常见语言的语法左值a会改变, 而右值b是只读的. 针对 上面的case
将 xml.someNOTExistField 放在 if 语句内作判断应该是右值, 不应该创建一个新的XMLList
只有 xml.someNOTExistField=; 做左值时, 自动创建一个新的XMLList才是合理的
陷阱二: 判断Function是否已经赋值
陷阱case:
var afunc:Function = testFunc;//testFunc是一个已经声明并且实现的函数, 略去
if( afunc != null ){ //如果直接用 if( afunc )来判断, 编译器会有警告, 所以不考虑那种情况
//这个判断逻辑具体不行!!!, 代码运行不到此行!
}
解决方法:
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已经将这个问题改正了
陷阱三: 中括号会引起运行时错误
陷阱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这个类的动态性做了优化吧!

陷阱四: String和Boolean的转换
陷阱case:
var strBoolean:String = "false";
if (strBoolean) {//因为strBoolean这个变量不是 null, 也不是 undefined, 所以为 true
trace("注意: 这个逻辑为 真");
}
if (new Boolean("")) {//Boolean的构造函数的参数是 null, undefined, "",时, 这个Boolean就是false
trace("注意: 这个逻辑为 否");
}
if (new Boolean("false")) { //只要构造函数的参数不是 null, undefined, "", 这个Boolean就是true
trace("注意: 这个逻辑为 真");
}
if (Boolean("false")) {//相当于调用Boolean的构造函数
trace("注意: 这个逻辑为 真");
}
if ("true" as Boolean) { //因为字符串永远不可能为 Boolean数据类型, 所以逻辑永远为 否
trace("注意: 这个逻辑为 否");
}

解决方法:
var someStr:String = xxxxx;
if( "true" == someStr ){} 或是
if( "false" != someStr ){}
问题分析:
AS3的Boolean构造其实不认String的 "true" 和 "false", 只认 "", 和非"".
陷阱五: String的逻辑判断需要注意 空字符串
陷阱case:
private function test(s:String):void {
if (s) { //这里的判断需要考虑 空字符串 的情况
trace("do something["+s+"]");
}
}

var str:String;
test(str);
str = null;
test(str);
str=""; //空字符串, 在业务上也是可能出现的
test(str);
str="hello"
test(str);//只有这个会 true
解决方法:
private function test(s:String):void {
if ( "true" == s) { //不变的法则
trace("do something["+s+"]");
}
}
问题分析:
这个和陷阱四本质上是一回事
陷阱六: XML中的true和false
陷阱case:
var xml:XML = false;
trace("getQualifiedClassName(xml.f)="+getQualifiedClassName(xml.f));//print XMLList
trace(xml.f);//print false
var v:Boolean = xml.f;
trace("v=" + v);//此处print为false,实为凑巧
if (xml.f) {
trace("注意: 处理为 真");
}

解决方法:
if( "true" == xml.f ){} 或是
if( "false" != xml.f ){}
问题分析:
xml.f 本质是一个XMLList, 无从谈起 逻辑, XML内容的本质都是String.
因为业务逻辑的判断只关心 "true" 或是 "false".
发表评论
-
Symbian OS S60三种开发环境的搭建,基于C++
2012-01-20 09:32 739Symbian OS S60三种开发环境的搭建,基于C++ ... -
Windows Phone开发(三)-- 导航原理分析
2012-01-20 09:32 654Windows Phone开发(三)-- 导 ... -
《Qt for Symbian》翻译系列之七:第二章 开始(1)
2012-01-20 09:32 860《Qt for Symbian》翻译系列之七:第二章 开始(1 ... -
onscripter For windows/MAC OS 中文版
2012-01-20 09:32 1481onscripter For windows/MAC OS 中 ... -
vs2008安装失败解决办法
2012-01-20 09:32 865vs2008安装失败解决办法 2011年04月22日 由 ... -
实习心得体会2
2012-01-19 14:34 681实习心得体会2 2010年06月20日 首先学习谢谢 ... -
墨子管理启发的“天龙八部”
2012-01-19 14:34 489墨子管理启发的“天龙 ... -
古代房屋,宫殿,屋内陈设介绍
2012-01-19 14:34 1230古代房屋,宫殿,屋内陈设介绍 2011年12月22日 ... -
2011-12-22
2012-01-19 14:34 7002011-12-22 2011年12月22日 室内设计原 ... -
JavaScript的例外处理(try...catch...finally)
2012-01-17 04:21 583JavaScript的例外处理(try...catch...f ... -
转载 js中的基本常识 收藏
2012-01-17 04:21 539转载 js中的基本常识 收 ... -
JavaScript--JavaScript对象
2012-01-17 04:21 630JavaScript--JavaScript对象 2 ... -
as3中数组的copy之concat
2012-01-17 04:21 630as3中数组的copy之concat 2 ... -
“魅力女性精英班培训”感受
2012-01-16 03:10 762“魅力女性精英班培训”感受 2009年09月10日 ... -
会说话的女人(二)
2012-01-16 03:10 641会说话的女人(二) 2009 ... -
女性最为吸引人的品质
2012-01-16 03:10 536女性最为吸引人的品质 ... -
导购知识
2012-01-16 03:10 530导购知识 2011年05月12日 ...
相关推荐
as3corelib-.93.zip as3corelib-.93.zip
v2x@ubuntu:~/Desktop$ sudo cp ./libpaho-mqtt3as.so/libpaho-mqtt3as.so /usr/lib/ v2x@ubuntu:~/Desktop$ sudo cp ./libpaho-mqtt3as.so/libpaho-mqtt3as.so.1 /usr/lib/ v2x@ubuntu:~/Desktop$ sudo cp ./...
as3 chm as3.chm 帮助文档
isr4200-universalk9_ias.16.06.08.SPA.bin
AS3[1].0与网络通信AS3[1].0与网络通信AS3[1].0与网络通信AS3[1].0与网络通信AS3[1].0与网络通信AS3[1].0与网络通信AS3[1].0与网络通信
从AS2到AS3.pdf从AS2到AS3.pdf从AS2到AS3.pdf从AS2到AS3.pdf
AS3殿堂之路.part1.rar AS3殿堂之路.part1.rar
AS3殿堂之路.part3.rar AS3殿堂之路.part3.rar
isr4200-universalk9_ias.16.12.04.SPA.bin
Flash.AS3殿堂之路.配套光盘共5部分
AS3殿堂之路.part2.rar AS3殿堂之路.part2.rar
as3_devguide.rar as3_devguide.rar as3_devguide.rar
as3isolib.v1.core类库,flash开发必备
支持Flex中将datagrid中的数据存储为xsl,并且1.0.1版本比1.0更好的支持中文
AS SSD Benchmark 内置XP系统下仍打开此工具的必需系统软件(需要安装dotnetfx.exe)
as3视频运动检测.rar .
Flash.AS3殿堂之路.配套光盘 共有5部分
Flash.AS3殿堂之路.配套光盘共5部分
AS3[1].Design.Patterns.Jul.2007