1

我是 JavaScript 新手,最近一直在用 PHP 进行编码,我希望将其移植到 JavaScript。PHP 在Map其容器类中直接实现了一个Array,这在 JavaScript 的默认语言中不存在。

我似乎读过的每个人都说要使用一个对象作为关联数组,但是在阅读了这个之后,特别是:

属性查找

当访问对象的属性时,JavaScript 会向上遍历原型链,直到找到具有请求名称的属性。

当它到达链的顶部 - 即 Object.prototype - 并且仍然没有找到指定的属性时,它将返回值 undefined 。

这似乎Object不是关联数组的有效解决方案,尤其是当您想要的数组可能包含 10 个或 1000 个时。

JavaScript 中映射/关联数组的有效替代方法是什么?是否有一个很好的 3rd 方库,它提供了一个很好的容器类,实现为 map/assoc。大批?我需要能够轻松有效地为我的代码中的各种索引策略创建大型多度关联数组,因此我需要最佳的排序和搜索算法。

如果这一切看起来很明显,请原谅我,但一切都在指向我实现我的 assoc。数组作为对象,我认为这不是最佳方法。非常感谢任何帮助和指导。

4

2 回答 2

1

您问题中的引用实际上与属性查找的优化程度无关。当你这样做时:var x = {}然后x.foo,它将检查 foo 是否存在。如果不是,那么它就不会“顺着链条上”并寻找其他地方,因为x它已经是最原始的对象类型。

您真正要问的是字符串查找的优化程度,因为您有一个对象。也就是说,看看这个:

http://www.timdown.co.uk/jshashtable/

它是 JS 中哈希表的实现。我没有检查它的优化程度,但在 Chrome 中它比仅使用常规 JS 对象作为哈希表慢 5 到 10 倍。(测试大小为 10000 个元素。)我自己编写了一个简单的 JS 哈希表并得到了相同的结果。

我会想象,但显然你应该测试一下,所有浏览器都将字符串键实现为内部优化的哈希,就像 PHP 数组的工作方式一样。从性能的角度来看,如果不这样做似乎很愚蠢。

于 2011-06-11T22:22:10.240 回答
1

就像链Object的最顶层一样prototype(您没有使用带有子原型的子对象),没有要评估的链。因此Object.prototype,它是用于检查属性的唯一原型。因此,实际上并没有像您在报价中暗示的那样存在问题。

于 2011-06-11T21:43:11.890 回答