昨晚我在Flash上思考了这个问题
var a:Number = 5;
var a = 5;哪个声明更好?第一个声明是否工作得更快,占用的内存更少?AS的所有示例都包含第一个声明方法(例如http://actionscriptexamples.com/2010/05/03/getting-started-with-the-tlftextfield-class-in-actionscript-3-0-and-flash-cs5/)。
var tlfTxt:TLFTextField = new TLFTextField();为什么他们使用第一种方法而不是第二种方法?
发布于 2011-05-02 20:33:14
还要考虑优化。即使你可以声明你的变量没有类型,比如
var a:* = 5,什么可以用的很棒,还是考虑下面的优化测试:
var a = 5;
var b:* = 5;
var c:Number = 5;
var d:int = 5;
var e:uint = 5;
var time_start:Number = getTimer();
for(var i:int = 0; i < 10000000; i++)
{
a += 1;
//b += 1;
//c += 1;
//d += 1;
//e += 1;
}
var time_stop:Number = getTimer();
trace(time_stop - time_start, "ms");
//a.) 650 ms
//b.) 651 ms
//c.) 106 ms
//d.) 69 ms
//e.) 69 ms结果显示了每轮在一台普通机器上的表现。无论上面示例中的确切数字是什么,重点都是查看速率:
在a和b的情况下,我们没有给变量指定类型。在第三种情况下(c.)我们给了它一个类型,我们达到了6.14倍的速度提升。
在d和e的情况下,您可以看到如果您确实专门设置了类型会发生什么:整型和无符号整型。这种情况下,如果你使用整数,你能获得的速度是非常大的(10x)。
在编写随机函数、大型计算或复杂引擎时,请考虑这一点。
发布于 2011-05-02 19:43:43
总是定义一个类型。如前所述,如果您不这样做,编译器将为您选择,并且可能不会像预期的那样。
在处理类时,它也变得很重要。例如,您在类中创建一个私有变量foo,例如:
private var _foo; // no type is defined稍后,您需要为它添加一个get/set属性:
public function get foo():??? { return _foo; }
public function set foo(val:???):void { _foo = val; }你会传递什么?您如何将其记录下来以供其他人使用?
就好像你有
private var _foo:Number;
public function get foo():Number { return _foo; }
public function set foo(val:Number):void { _foo = val; }很明显,foo在get/set两种情况下都做了什么。
还有一件事。如果要创建引用舞台上的内容的MovieClip变量,请这样做:
var mymc = stage_mc; // Hmmm, not so good如果你想在mymc上调用一个MovieClip方法,比如play(),编译器会抛出一个错误,因为它不“知道”mymc有一个play方法(怎么会呢?)因此,通过键入它(在向其添加类型的意义上,如MovieClip),您可以让编译器知道哪些方法和属性应该是可用的。
示例:
var mymc:MovieClip = stage_mc; // Ahh, much better!它还允许编译器进行类型检查。因此,在上面的示例中,如果您试图将文本字段传递给movieclip变量mymc,则会抛出一个错误。这可以阻止更大的bug潜入。
我对AS3中的类型检查非常感兴趣--我很高兴Flash最终引入了它,现在它已经出现了,让我们使用它吧!
发布于 2011-05-02 21:40:55
在AS3中,几乎没有什么理由不显式地键入某些内容。在某些情况下,它是适当的,但类型系统是为了防止出现问题。
至于速度/内存差异,这是一个很好的解释:http://onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf
https://stackoverflow.com/questions/5856433
复制相似问题