flash - 有趣的 AS3 哈希情况。它真的像文档所说的那样使用严格的平等吗?

标签 flash actionscript-3 dictionary equality key-value

AS3 代码:

import flash.utils.Dictionary;
var num1:Number = Number.NaN;
var num2:Number = Math.sqrt(-1);
var dic:Dictionary = new Dictionary( true );
trace(num1); //NaN
trace(num2); //NaN
dic[num1] = "A";
trace( num1 == num2 ); //false
trace( num1 === num2 ); //false
trace( dic[num1] ); //A
trace( dic[num2] ); //A

关于 key 比较方法...
"The Dictionary class lets you create a dynamic collection of properties, which uses strict equality (===) for key comparison. When an object is used as a key, the object's identity is used to look up the object, and not the value returned from calling toString() on it."

如果 Dictionary 使用严格相等,如文档所述,那么 num1 === num2 是如何为假的,而 dic[num1] 解析为与 dic[num2] 相同的哈希槽?

最佳答案

Adobe给出的描述说实话既不准确也不正确,但它更简单,涵盖了大多数情况。

您应该尝试以下方法:

for (var key:* in dic) trace(getQualifiedClassName(key));//will give you 'String'

此行为适用于 ArrayObject也是。

根据经验:intint并且任何其他键都转换为其字符串表示形式(包括 bool 值和浮点值,以及 nullundefined )。
Dictionary类的不同之处在于它不会将非原始对象转换为 String , 但直接将它们用作键。他们处理所有其他值的方式是“继承的”Object如果你愿意的话。

基本上,Object由 2 个散列组成,一个用于字符串,一个用于整数键。和 Dictionary添加另一个哈希,可能只是使用对象内存地址作为整数键。

编辑:不是对实际问题的真正答案,而是我想详细解释的一点,以回应 Triynko 的评论:

Hacky? You mean, making it work in a way it's not designed to work? Well... since it's not designed to handle 64-bit integers, of course it's a hack. But 64-bits is 64-bits, whether they're interpretted as an integer or floating point.



使用 64 位浮点数来表示 64 位整数已经是一个坏主意,因为从语义上讲,这是完全错误的(您通常可以预料到这种误用会产生问题)。

但是然后使用他们的字符串表示作为键(如果你使用浮点数作为键,这会隐含地发生)是简单的自杀:
var f1:Number = 1000000000000003000000000.0;
var f2:Number = 1000000000000002000000000.0;
trace(f1 == f2);//false
trace(String(f1) == String(f2));//true ... kabooooom

您将很难确定 2 个 64 位整数何时会发生冲突,因为先决条件是它们的值的字符串表示形式被解释为浮点数必须相等。此外,不同的播放器版本可能具有不同的浮点字符串转换,如 LightSpark 等替代运行时可能会有不同的字符串转换。 .我真的不想依赖这个。当有足够的数据导致碰撞时,这会产生似乎无处不在的错误。而且您不会喜欢追踪它们。

此外,浮点键的性能更差,因为它们必须在用于哈希查找之前转换为字符串。如果您真的非常关心大小,那么您必须将数据作为 64 位 int 传输,然后仅在闪存端将其转换为十六进制字符串。
尽管如此,我要指出,许多人们非常乐意使用 XML 或 JSON,它们的开销要低得多。

带宽和任何其他硬件资源都很便宜。开发成本高。您应该编写可维护和健壮的应用程序,否则从长远来看它们会花费您更多。

问候
back2dos

关于flash - 有趣的 AS3 哈希情况。它真的像文档所说的那样使用严格的平等吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2906911/

相关文章:

flash - 检查SoundChannel是否正在播放声音

actionscript-3 - AS3:如何停止电影剪辑中播放的主要声音

html - 我可以在 html 电子邮件中发布嵌入对象,如 flashvideo/youtube 吗?

javascript - ActionScript 3 中类似 JSObject 的东西?

apache-flex - 如何使用 Flash 检索 HTTP 403 的正文?

xml - 查明 AS3 的 XMLList 是否包含字符串作为节点值

actionscript-3 - 使用类似 haar 的功能在 Flash 中进行对象检测

python - 嵌套字典中的键是否包含 NaN 值?

python - Pandas DataFrame 包含 JSON 格式的日期和时间

Python请求获取JSON