About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Apr

    29

    即使是AS2的老手,有时候也会因为AS的升级而不习惯。如for...in在AS2中可以循环遍历一个对象的所有属性,但有时候会发现在AS3时无法遍历一个对象的所有属性。如下一个文档类代码:
     

    package {
        import flash.display.Sprite;
        public class ForIn extends Sprite {
            public function ForIn() {
                var a:Zine=new Zine();
                var b:Wow=new Wow();
                a.url="www.zinewow.cn";
                a.name="古树";
                for (var k in a) {
                    trace(a[k]);
                }
                //b.url="www.zinewow.cn";
                //b.name="古树";
                //如果不注释掉上面二行,编译无法通过
                for (var j in b) {
                    trace(b[j]);
                }
            }
        }
    }
    dynamic class Zine {
        public var web1:String="zinewow.cn";
    }
    class Wow {
        public var web2:String="zinewow.cn";
    }

    在使用for...in时会发现无法遍历a,b二个对象的所有属性,甚至还会发现b对象的动态属性url与name无法添加。这是因为AS3中for...in(以及新增的for each...in)只能遍历动态类生成对象的动态属性。类需要通过添加dynamic关键字,生成动态类才可以添加动态属性,而密闭类是无法添加动态属性的。但动态类生成对象中的非动态属性在使用for...in(与for each...in)时,还是无法被遍历的。 
     

    Apr

    29

    原始数据类型,有些书上称为基元数据类型或基本数据类型。那么在actionscript中原始数据类型到底是值类型还是引用类型呢?可先测试如下代码。
     

    var a = new String("zinewow.cn"); 
    var b = new String("zinewow.cn"); 
    trace(a == b); 
    var c= new Number(1); 
    var d= new Number(1); 
    trace(c == d); 
    var e=new Boolean(true); 
    var f=new Boolean(true); 
    trace(e == f);

    在发布设置中分别设置成AS1、2、3发布,会发现在AS1与AS2中所有输出都为false;在AS3中所有输出又都变成true。其实在actionscript中,原始数据类型和复合数据类型(也有称之为复杂数据类型)都是引用类型,在AS1与AS2中是引用的比较,所以都输出了false,虽然AS3中同样是引用的比较,但它把这个问题给修正过来了,对原始数据类型变成了引用的值的比较。 
     

    Apr

    26

    一般中文的XML文档如使用的为全角标点符号则无关紧要,少数英文的XML文档可能需要用上。

     以下半角符号会被为是XML的关键标识符,需要转义字符(连同分号),“<,>,&,',"”: 

    &lt; < 小于
    &gt; > 大于
    &amp; & 和号
    &apos; ' 省略号
    &quot; " 引号

    注:严格的讲,只有“<”和“&”需要转义字符,而单引号,双引号,大于号是合法的。

    还有一种方法,是使用CDATA标签(部件):以“<![CDATA[”标记开始,以“]]>”标记结束。所有在CDATA标签之间的文本,包括所有XML文件关键标识符都会被解析器忽略。

    Apr

    15

    删除与某个字符相邻且相同的字符(博彦面试题算法,据说这算法也是全国计算机等级考试C++语言的必考的题目之一)。比如“fdaffdaaklfjklfja”字符串处理之后成为“fdafdaklfjklfja”。我写了一个较简单的ActionScript 2的版本算法。
     

    var str = "someString";//someString替换成任意非空字符串
    var strTemp = "";
    for (var i=0,j=i+1; j<=str.length; j++, i++) {
        if (str.charAt(j) != str.charAt(i)) {
            strTemp = strTemp+str.charAt(i);
        }
    }
    str = strTemp;
    delete strTemp;
    trace(str);

    再对版本扩展一下,删除非空字符串中任意相邻却相近的特殊字符,比如半角空格和全角空格:
     

    var str = "someString";//someString替换成任意非空字符串
    var strTemp = "";
    for (var i = 0, j = i+1; j<=str.length; j++, i++) {
        if (str.charAt(i) != " " && str.charAt(i) != " " || str.charAt(j) != str.charAt(i)) {
            strTemp = strTemp+str.charAt(i);
        }
    }
    str = strTemp;
    delete strTemp;
    trace(str);


    没有使用递归,是因为其它某些语言中对递归算法没有作次数限制,但在ActionScript中因为对递归函数作了次数限制,递归深度不可超过256级,否则FLASH播放器会将递归函数作为无限循环(死循环)而中止,一篇文章一般不止256个字;另外据ActionScript白皮书介绍,递归算法的速度比非递归的速度要更慢。

    (这里只是提供ActionScript2版本,以供不能使用ActionScript3 RegExp 功能的人参考,因为现在的电子杂志制作软件和组件大多都只支持ActionScript2,如某些人可能要制作电子杂志的搜索插件,可能就需要用到上面的对多个空白字符或回车符等处理的算法。)