gpt4 book ai didi

actionscript-3 - 当我在AS3中使用for(对象中的i)时会发生什么情况?

转载 作者:行者123 更新时间:2023-12-04 03:16:33 25 4
gpt4 key购买 nike

要遍历AS3中Object的属性,可以使用for(var i:String in object),如下所示:

对象:

var object:Object = {

thing: 1,
stuff: "hats",
another: new Sprite()

};

循环:
for(var i:String in object)
{
trace(i + ": " + object[i]);
}

结果:

东西:帽子
东西:1
另一个:[对象雪碧]

但是,选择属性的顺序似乎是变化的,并且从未匹配我能想到的任何内容,例如字母属性名称,创建它们的顺序等。实际上,如果我在不同的地方尝试了几次不同的时间,顺序是完全不同的。

是否可以按给定顺序访问属性?这是怎么回事

最佳答案

我将其发布为答案,只是通过直接查看Flash Player源代码来补充BoltClock's answer并获得一些额外的见识。我们实际上可以看到专门提供此功能的AVM代码,它是用C++编写的。我们可以在ArrayObject.cpp中看到以下代码:

// Iterator support - for in, for each
Atom ArrayObject::nextName(int index)
{
AvmAssert(index > 0);

int denseLength = (int)getDenseLength();
if (index <= denseLength)
{
AvmCore *core = this->core();
return core->intToAtom(index-1);
}
else
{
return ScriptObject::nextName (index - denseLength);
}
}

如您所见,当有合法属性(对象)返回时,它是从 ScriptObject类(特别是 nextName()方法)中查找的。如果我们在ScriptObject.cpp中查看这些方法:
Atom ScriptObject::nextName(int index)
{
AvmAssert(traits()->needsHashtable());
AvmAssert(index > 0);

InlineHashtable *ht = getTable();
if (uint32_t(index)-1 >= ht->getCapacity()/2)
return nullStringAtom;
const Atom* atoms = ht->getAtoms();
Atom m = ht->removeDontEnumMask(atoms[(index-1)<<1]);
if (AvmCore::isNullOrUndefined(m))
return nullStringAtom;
return m;
}

正如人们在这里指出的那样,我们确实可以看到虚拟机正在使用哈希表。但是,在这些函数中提供了特定的索引,乍一看,这将建议随后必须进行特定的排序。

如果您进行更深入的研究(我不会在此处发布所有代码),for in/for每个功能都涉及许多不同类的方法,其中一种是 ScriptObject::nextNameIndex()方法,它基本上提取了整个哈希表并且只要开始为表中的有效对象提供索引,并递增自变量中提供的原始索引,只要下一个值指向有效对象即可。如果我的解释正确,那么这就是您进行随机查找的原因,并且我认为这里没有任何方法可以在这些操作中强制使用标准化/有序的 map 。

来源
对于那些可能想要获取Flash Player的开源部分源代码的人,可以从以下Mercurial存储库中获取它(可以像github一样下载zip中的snapshop,因此您不必安装mercurial ):

http://hg.mozilla.org/tamarin-central-这是“稳定”或“发布”存储库

http://hg.mozilla.org/tamarin-redux-这是开发分支。可在此处找到对AVM的最新更改。这包括对Android等的支持。 Adobe仍在更新和开放Flash播放器的这些部分的采购,因此它是最新的和正式的资料。

当我在使用它时,可能也会对此感兴趣: http://code.google.com/p/redtamarin/。它是AVM的分支版本(相当成熟),可用于编写服务器端操作脚本。内容整洁,并且拥有大量信息,可深入了解AVM的工作原理,因此我想也将其包括在内。

关于actionscript-3 - 当我在AS3中使用for(对象中的i)时会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10083064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com