AS3 if 判断的陷阱


AS3 if 判断的陷阱
2011年07月01日
   陷阱一: 判断xml中是否有某个字段
  陷阱case:  var xml:XML = ;
  if ( xml.someNOTExistField ) { //这个居然也为真!! 要知道someNOTExistField 这个是没有定义的
  //下面的trace显示, xml.someNOTExistField 是一个 XMLList类型
  trace("xml.someNOTExistField class="+getQualifiedClassName(xml.someNOTExistFiel d));
  }
  解决方法:
  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)="+getQualified ClassName(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".

猜你喜欢

转载自ybhy40ybhy.iteye.com/blog/1359609
今日推荐