【发布时间】:2016-06-24 14:18:08
【问题描述】:
根据我对文档(here 和 here)的理解,需要引用内存地址才能使其工作:
const foo = {};
const map = new Map();
map.set(foo,'123'); // Can only be done if memory address of `foo` is known. Any other shimming would require stringification of foo
这是因为 JavaScript 对象 {} 键只能是字符串(至少在 ES5 中)。
但我看到Map shim 可用:https://github.com/zloirock/core-js#map。我尝试阅读源代码,但它过于简洁抽象(internally 使用 strong collection which then imports 10 more files)
问题
请回答以下任一问题
- 是否有一个简单的技巧,甚至可以真正做到(无需字符串化)吗?
- 也许它会改变
foo以在其上存储一些字符串,然后将其用作键? - 还有其他问题,也许我读错了文档?
【问题讨论】:
-
我很确定垫片只是使用
===来比较对象身份,因此有许多 O(N) 操作而不是 O(1) 或 O(log(N))本机实现可能具有的操作。 -
ES2015
Map无法正确填充,我相信最接近的实现是记录键、某种迭代以及与对象的定期比较,正如 Jeremy 所提到的那样。 -
Here's 一个可读的 polyfill 顺便说一句
-
@ArtoAle 变异并在密钥上添加
_id以用于在接受的答案中进行查找解决方案就是这样做的。尽管如此,我的怀疑是正确的,ES5 没有 零影响 实现。感谢您的所有时间???? -
@basarat 完全同意-您可以通过修改关键对象来提高性能-即使您可能无法这样做,例如如果
key已经通过Object.freeze
标签: javascript typescript ecmascript-6