var n:Number = 1;
trace("n is Number:" + (n is Number)); //true
trace("n is int:" + (n is int)); //true
trace("n is uint:" + (n is uint)); //true
var m:Number = 1;
trace("m is Number:" + (m is Number)); //true
trace("m is int:" + (m is int)); //true
trace("m is uint:" + (m is uint)); //true
他们都是真的!在actionscript中,如何判断数字的类型是Number还是int还是uint?
最佳答案
这里的困惑源于 AS3 如何处理类型和数字的特殊微妙之处。 is
运算符测试类继承,但 int
和 uint
实际上不是类。 (这就是为什么它们没有大写 - 因为它们没有类定义。)它们更像类型关联,如果使用得当,可以为您带来一定的便利和性能改进。但出于继承目的,数字就是数字。
这在实践中意味着,如果您创建一个类型为 uint
的变量,那么 Flash 会以 32 位无符号格式(而不是 64 位格式)在内部存储该值用于数字
)。如果您更改该变量的值,它将保持相同的格式,因此将强制执行对 uint
的限制:
var a:uint = 0;
a--;
trace(a); // 4294967295 - it wrapped around
但它实际上是对输入为 uint
的号码的引用,而不是号码本身。如果您创建一个新的非类型化引用,这将是显而易见的:
var a:uint = 0;
var b:* = a;
b--
trace(b); // -1
那么回到你的问题,你应该如何实现你的缓冲区写入器?由于 Flash 处理这些类型的方式固有的微妙性,我认为没有绝对正确的答案。一种方法是如果数据满足这些类型的限制,则使用 uint
或 int
,否则使用 Number
。这将节省内存并保持准确性。但将所有数字视为 Number
也让我觉得这是一种合理的方法。我认为这取决于您计划如何使用缓冲区。
关于flash - 在actionscript中,如何判断数字的类型是Number还是int还是uint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2669564/