JavaScript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)不允许您通过设计获得密钥或长度或大小。如何遍历弱映射?
是否有可能以某种方式循环条目?
如果不是,Chrome控制台如何做到这一点?
JavaScript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)不允许您通过设计获得密钥或长度或大小。如何遍历弱映射?
是否有可能以某种方式循环条目?
如果不是,Chrome控制台如何做到这一点?
是否有可能仍然遍历以某种方式记录?
没有,就像你说的,一个WeakMap
的内容不是由设计访问,并没有iterability。
如果不是... Chrome控制台如何做到这一点?
控制台使用JS引擎的调试API,它允许对对象的访问的内部(也答应状态,原语包裹等)等等。
自从我读了这个答案后,我开始注意到在Chrome控制台中更奇怪的魔法。在极少数情况下,控制台在试图跟踪代码时,也可以输出未来的数据:-) – commonpike
@commonpike:该特定行为在[这里]解释(http://stackoverflow.com/q/23392111/ 1048572)。 – Bergi
那些看起来像来自未来的价值观相对于过去,但不会比现在更进一步。 :} – trusktr
你可以使用这个小片段的通用for each。但它使用lodash并且可以大大增强。
import lodashForEach from 'lodash/forEach';
import entries from 'lodash/entries';
/**
* @since [email protected]
* @param {Array|Map|Object|Set|WeakMap|WeakSet} iterable
* @param {Function} iteratee
* @example
* const iterable = new Map();
* iterable.set('somekey1', 1);
* iterable.set('somekey2', 2);
* // or
* const iterable = new Set();
* iterable.add("entry1");
* iterable.add("entry2");
* // run function
* forEach(iterable, (value, key) => {
* console.group('-');
* console.info('KEY');
* console.log(key);
* console.info('VALUE');
* console.log(value);
* console.groupEnd();
* });
*/
function forEach(iterable, iteratee) {
lodashForEach((iterable instanceof Set || iterable instanceof WeakSet) ? Array.from(iterable) : entries(iterable), (entry, index, collection) => {
iteratee(entry[1], entry[0], collection, index);
});
return iterable;
}
export default forEach;
UPDATE
后好长一段时间,我发现这个答案不正确。东西是旧版核心 - js填充库有固定的bug,它取代原生WeakMap实施与自己的。所以我的解决方案在现代浏览器中无效。
function forEach(iterable, iteratee) {
switch (true) {
case Array.isArray(iterable) || iterable instanceof Map:
iterable.forEach(iteratee);
break;
case iterable instanceof Set:
Array.from(iterable).forEach(iteratee);
break;
case iterable instanceof WeakMap || iterable instanceof WeakSet:
// some kind of warning
break;
default:
Object.keys(iterable).forEach((key) => iteratee.call(null, iterable[key], key));
break;
}
return iterable;
}
问题是:WeakMaps不可迭代,所以此解决方案不适用。 myWeakMap.entries()。length == 0; 因此,对于WeakMap中的项目,不要调用iteratee。 –
'Array.from(new WeakMap()。set({},{}))'...没有运气。 – Pacerier
不,弱映射不可迭代。控制台可以实现魔法(嘿,它同时也显示了promise的价值)。 – Bergi
好的 - 我想要做那个魔法,有什么建议吗? :-D – commonpike
编写一个使用调试接口的应用程序,然后:-) – Bergi