与普通对象类似地访问 JavaScript 映射

2024-02-15

我正在使用地图

因为我想存储一个对象作为键。

我的问题是 - 我可以像访问普通对象一样访问地图吗?

例如:

let m = new Map();
let obj = {foo:'bar'};
m[obj] = 'baz';
console.log(m[obj]);

这应该按原样正常工作吗,还是我需要使用 Map 的 get/set 方法?

我问的原因是因为如果我需要使用 get/set 它会迫使我仔细重构大量代码。

这是可能需要重构的实际代码示例:

// 之前(broker.wsLock 是普通对象)

function addWsLockKey(broker, ws, key) {
  let v;
  if (!( v = broker.wsLock[ws])) {
    v = broker.wsLock[ws] = [];
  }
  if (v.indexOf(key) < 0) {
    v.push(key);
  }
}

// 之后(broker.wsLock 是一个 Map 实例)

function addWsLockKey(broker, ws, key) {
  let v;
  if (!( v = broker.wsLock.get(ws))) {
    v = [];
    broker.wsLock.set(ws, v);
  }
  if (v.indexOf(key) < 0) {
    v.push(key);
  }
}

有没有办法将 v 设置在与 set() 调用同一行?


如果您想访问实际值Map对象,那么你必须使用.get() and .set()或各种迭代器。

var m = new Map();
m.set("test", "foo");
console.log(m.get("test"));    // "foo"

定期财产访问Map例如:

m["test"] = "foo"

只是在对象上设置常规属性 - 它不会影响实际的地图数据结构。

我想这是通过这种方式完成的,以便您可以访问Map对象属性与成员分开Map数据结构和两者不应相互混淆。


此外,常规属性仅接受字符串作为属性名称,因此您无法使用常规属性来索引对象。但是,地图对象在使用时具有该功能.set() and .get().


您要求对此做出“明确”答复。在里面ES6规范 http://www.ecma-international.org/ecma-262/6.0/#sec-map.prototype.set,你可以看看什么.set()并看到它运行在[[MapData]]内部槽这肯定与对象的属性不同。同样,该规范中也没有任何地方说使用普通属性访问将访问内部对象[[MapData]]。因此,您只需查看对象的正常属性访问描述即可。 AMap is an Object并且里面什么也没有Map规范规定,普通属性访问的行为应该与任何其他对象的行为不同。事实上,它必须对所有方法执行相同的操作Map对象,否则如果您碰巧将一个项目放入其中,它们将无法工作Map使用与方法名称相同的键。所以,你的证据包括:

  1. 一个简单的测试将向您展示属性访问不会在Map本身只是一个常规属性。
  2. 该规范描述了一个Map作为一个对象。
  3. 规范描述了如何.get() and .set()在内部插槽上操作[[MapData]].
  4. 规范中没有任何内容说明属性访问Map对象的工作方式应该与平常有所不同。
  5. 如果属性访问确实访问了MapData,那么如果您碰巧将密钥放入Map与方法名称冲突 - 如果是这种情况,那将是一团糟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与普通对象类似地访问 JavaScript 映射 的相关文章

随机推荐

  • 在android中设置每小时重复的闹钟管理器

    我想在 android 中每小时获取一次位置 为此 我使用闹钟管理器并设置每小时重复的闹钟 只想在固定时间 即上午 8 点和下午 12 点 之后写入文件 我在设置警报管理器时遇到问题 虽然我设置为每一小时 但它在 1 2 小时内执行 on
  • 使用 Postgres 查询哈希数组的数组

    我有一个模型 其中有一列如下所示 示例 column A gt 1 B gt 2 a b c n Where a b c and n也是哈希值 如下所示 示例 a X gt x Y gt y 目前 如果我调用记录m模型的 例如 m colu
  • 在 iOS9 中使用“hw.machine”标志调用“sysctlbyname(...)”

    继 WWDC 2015 会议 703 隐私和您的应用程序 之后 使用sysctl 现在我们将无法再打电话kern proc kern procargs kern procargs2并查看来自任何其他进程的数据 然后是自己的数据 这是苹果公司
  • Swift 中 C# 或 Java 泛型接口的等效项是什么?

    我是 C 的 Swift 新人 我开始从抽象级别设计 Swift 程序 声明实体签名及其之间的关系 我发现 swift 中的协议类似于 C 或 Java 中的接口 从我 作为 C 的 Swift 新人 的角度来看 协议中的泛型以一种不常见的
  • Prawn - 在 text_box 展开后向下移动光标

    我正在使用 Prawn Gem 生成 PDF 但我无法找到移动 PDF 的方法cursor之后下来text box从溢出文本扩展 类似于常规的方式text打电话会 文本框示例 pad 5 text box payable at gt bou
  • Play 框架和 sbt:将凭据传递到 Nexus 密码保护的存储库

    我需要将以下库定义为依赖项 url http deploy cloud testmx com 8081 nexus content groups public http deploy cloud testmx com 8081 nexus
  • 使用 Typescript 热重载 IIS Web 服务器做出反应

    在使用 C Web Api 后端使用 TypeScript 开发 React 应用程序时 我想使用热重载 我使用 Net 框架而不是 Core 所以我需要使用 IIS 或 IIS Express 我可以使用前端热重载webpack dev
  • 在VS2015 RC上添加Native Tools命令提示符

    由于我在以下位置找不到 Native Tools CMDTools菜单 我尝试手动添加它外部工具 几个问题 不管我选择什么Command ARM x86 或 x64 等 Command总是C Windows System32 cmd exe
  • 在Android中使用Bundle代替直接Intent putExtra()的优点

    在我的android应用程序中我总是直接使用putExtra 的函数Intent类将任意数量的值传递给 newActivity 像这样 Intent i new Intent this MyActivity class i putExtra
  • 以编程方式将 Razor 页面呈现为 HTML 字符串

    Goal 我正在尝试按照我的意愿在后端生成 HTML 字符串 使用 HtmlToPDF 库将其转换为 PDF 我还希望能够在浏览器中轻松查看生成的 HTML 以进行调试 调整 该页面仅在以下情况下才会公开IsDevelopment 我希望它
  • Web Api 请求内容在操作过滤器中为空

    我有一个名为Log尝试将请求和响应的内容记录到文本文件中 我已将其放在我的控制器上以涵盖所有操作 在LogAttribute我正在以字符串形式读取内容 ReadAsStringAsync 所以我不会丢失请求正文 public class L
  • 如何删除带或不带空格的空行

    我有一个大字符串 我用换行符分割它 如何删除所有空行 仅限空白 伪代码 for stuff in largestring remove stuff that is blank 尝试列表理解和string strip http docs py
  • C++17 赋值排序:GCC 中仍未实现?

    我尝试了以下代码作为实现交换的天真的尝试R and B中的字节数ABGR word include
  • 为什么所需的 Startup 类不需要实现适当的接口,例如 IStartup?

    使用武士刀 为什么Startup类不应实现各自的接口 例如 interface IStartup void Configuration IAppBuilder app public class MyStartup IStartup publ
  • 在线求职门户系统用例图

    我想要一个在线求职门户系统的正确用例图 这是我的尝试 我有些疑惑 我看不出在哪里制作 登录 用例 这是该系统的一个重要用例 该用例图没有显示简单访问者和注册访问者之间的区别 前者可以查看职位空缺 查看建议 而无需拥有帐户 后者可以查看职位空
  • 使用 PyYAML.dump() 生成锚点?

    我希望能够在 PyYAML 的 dump 函数生成的 YAML 中生成锚点 有没有办法做到这一点 理想情况下 锚点应与 YAML 节点具有相同的名称 Example import yaml yaml dump a 1 2 3 a 1 2 3
  • 使用 php curl 抓取动态加载网站

    我是抓取新手 已经正式废弃了两个网站 但是当我尝试抓取动态加载网站时 问题出现了 当网站用 JavaScript 渲染时 我无法抓取网站的内容 有什么方法可以使用该网站的内容php curl或任何其他相关客户PHP 这就是我到目前为止所做的
  • 等到所有 jQuery Ajax 请求完成?

    如何让一个函数等待 直到所有 jQuery Ajax 请求在另一个函数内完成 简而言之 我需要等待所有 Ajax 请求完成后才能执行下一个请求 但如何呢 jQuery 现在定义了一个当函数 http api jquery com jQuer
  • F# 将元素添加到序列

    一个简单的问题我找不到答案 如何将元素添加到序列中 例如 我有一个 seq 和一个 newElem XElement 我想附加到它 Thanks 序列追加 gt let x 1 5 val x seq
  • 与普通对象类似地访问 JavaScript 映射

    我正在使用地图 因为我想存储一个对象作为键 我的问题是 我可以像访问普通对象一样访问地图吗 例如 let m new Map let obj foo bar m obj baz console log m obj 这应该按原样正常工作吗 还