在我的内容脚本中,我使用Map
来跟踪所有打开的弹出窗口。在Map
键值对构造如下:ES6地图的关键相等性在Chrome内容脚本中表现异常
- 键 - 参考由
Window.open()
- 返回值 - 某些相关数据
问题是,Map.prototype.has()
和Map.prototype.get()
有时返回意外的结果。
// content.js
let map = new Map();
let popup = window.open('https://www.google.com');
let data = {};
map.set(popup, data);
// retrieve data later
window.setTimeout(() => {
// should return true, but sometimes return false
console.log(map.has(popup));
// should return {}, but sometimes return undefined
console.log(map.get(popup));
}, 3000);
由于某种原因,似乎添加的密钥和参考popup
并不总是被认为是“相等的”。而这种模糊的情况似乎只存在于内容脚本中。如果上面的代码是在浏览器的控制台中执行的,那么map.has()
和map.get()
将总是返回正确的值。
所以我的问题是:为什么发生这种情况?是由一些内容脚本的基础机制引起的,我没有意识到这一点?
您的真实代码是否包含在IIFE中,还是变量实际上是全局范围的?有可能'popup'正在被页面上的东西重新分配? – loganfsmyth
@loganfsmyth我为调试构建了这个简化版本。所以它“是”我的内容脚本中的真实代码。没有IIFE的包装,没有其他的内容脚本,甚至没有背景剧本在肆虐。 – Microloft
虽然这可能是一个浏览器错误,但您可以尝试使用'const'。实际上,如果您不重新分配价值,您应该始终使用它。 – wOxxOm