Array
上运行for ... in
表达式时,您的迭代器不是预期的整数,而是被强制转换为字符串。让我举个例子...for (var key:int in a) { //
trace(getType(item) + " = " + a[key])
}
function getType(value:*):String {
// Returns the type of object passed to it.
var msg:String = flash.utils.getQualifiedClassName(value);
if (msg.lastIndexOf("::") != -1) {msg = msg.split("::")[1];}
return msg;
}
运行此代码,你会得到编译错误。
1067: 将字符串类型的值隐式强制转换为不相关的 int 类型。
你可能认为 Adobe 应该注意返回值取决于源对象,但在 API 参考中,它明确指出...
嗯,这显然是个谎言,否则我们怎么遍历 Dictionary
对象呢?
var a:Array = ["a","b","c"];
var dict:Dictionary = new Dictionary();
dict[a] = true;
for (var key:Object in dict) {
trace(getType(key)); // traces: "Array"
}
立即,您应该注意到我们的key
变量在强类型方面存在差异。尽管Object
是Array
的父类,因此不会引发编译错误,但它也没有被强制转换为字符串。
再次尝试将其作为Object
应用于我们的数组索引...
for (var key:Object in a) {
trace(getType(item) + " = " + a[key]) // traces: "int = a, int = b, int = c"
}
我们如何使用对象键访问数组值呢?这不是一个字典。
我想我在某种程度上正在发泄,但我认为这是一个错误,并且值得向Adobe报告吗?
variableIterant:String
的API文档链接,但是我假设由于Dictionary
不是原始类型,并且不继承自Array
,所以它不必遵循相同的规则。诚然,这很令人困惑,但更令人困惑的是,有大约5个不同的类似于Array的类,而且没有两个类的行为和函数是相同的。 - CyanAngel