gpt4 book ai didi

javascript - javascript 的 Set 和普通的普通对象有什么区别?

转载 作者:行者123 更新时间:2023-11-29 19:29:19 28 4
gpt4 key购买 nike

试图解决这个问题question ,了解了javascript的Set对象的存在。然后我检查了MDN's Set documentation ,我在这里问的问题立即弹出。

这场辩论始于上述 question's回答评论。我发现 this线程也有助于辩论。

到目前为止,我自己可以从辩论中得出的结论是:

  • Set 在其 API 中提供了一个“clear”方法,这是一个不错的功能
  • Set 确保添加的元素的顺序保持不变。一个普通的对象没有。

  • 如果有的话,谁能给出一个明确的结论?也许我不应该将两者进行比较......但我仍然认为这是一个合理的问题,而且很可能其他人在了解 Set 后也会提出同样的问题。

    无论如何,最初促使我提出这个问题的是 编辑 MDN 的 Set specs 添加了此处获得的结论。但是在这里开发线程之后,我认为我不应该这样做,也许 Set 的规范确实不应该提到“普通对象最终提供类似功能的情况”的事情。至少无论谁问自己这个问题,仍然可以在 SO 中找到它,并享受这里添加的见解/贡献。

    最佳答案

    首先,here's a post 的代码显示了如何开始使用纯 Javascript 对象进行类似集合的行为(有一些限制)。

    而且,这里是 a set of objects(在 ES5 中工作)用于获得更多类似集合的行为。

    而且,这里是 ES5 中实现的 Set 对象的部分 ES6 polyfill

    如果你研究过这段代码,你会发现一个普通的 Javascript 对象在很多方面都远远低于 ES6 Set,这需要大量的额外编码来解决。

    以下是其中的几个问题:

  • 将对象分配为键将无法正常工作,因为所有对象都转换为 "[object Object]" 的字符串键,因此所有对象在您的类似集合的 Javascript 对象中都具有相同的键。
  • 将数字分配为键将转换为字符串表示,因此像 4"4" 这样的键会发生冲突。

  • ES6 Set 对象没有这些限制。以下是对这两个问题的更多讨论:

    如果您查看 this answer to a prior post and the code in that answer ,您可以看到底层 Javascript 对象如何用作类似集合行为的查找机制。虽然没有大量其他编码,但它有一些限制,因为 Javascript 对象需要一个字符串作为查找键。 ES6 Set 不是 。因此,开箱即用的 ES6 Set 支持将对象作为元素。将 Javascript 对象用作穷人的集合不支持将对象作为集合中的元素。

    当您想将对象添加到纯 Javascript 基于对象的集合中时,这将成为最重要的。
    // create a set-like object
    var mySet = {};

    // create an object and put it in the set
    var myObj = {greeting: "hello"};
    mySet[myObj] = true;

    因为 Javascript 对象需要一个字符串键,所以它会调用 myObj.toString() 来获取这样的键。如果没有对 toString() 方法的自定义覆盖,它将显示为“[object Object]”,这根本不是您想要的。有关演示,请参阅 here。它似乎适用于一个对象,但是一旦您在集合中有多个对象或将集合设置为不同的对象,它就根本不起作用,因为所有对象都将使用相同的键进行索引。

    另一方面,使用实际的 ES6 集,它本身就可以很好地接受和处理对象——你不必做任何特别的事情。

    如果您想了解如何使用纯 Javascript 对象作为查找机制尽可能接近地模仿 ES6 集,请阅读 this answer。更多信息是 located on github ,您可以在其中查看如何使常规的基于 Javascript 对象的集合实现支持 this ObjectSet implementation 的 Javascript 对象。甚至还有一个使用底层 Javacript 对象作为存储机制的 ES6 Set polyfill here

    第二个问题 出现在基于 Javascript 对象的集合实现中,这也是由于字符串键的要求。如果你这样做:
    var mySet = {};
    mySet[4] = true;
    mySet["4"] = true;

    您最终将只有一件元素。这是因为 mySet[4] = true;4 转换为字符串 "4" 以用作键。如果您仅在集合中使用字符串或仅在集合中使用数字,则可以轻松解决此问题,但是如果集合中同时包含字符串和数字,则基于 javascript 对象的集合实现无法区分 4"4" 因此不将它们视为集合中的单独项目。 ES6 确实做出了这种区分。

    同样,可以使用更多代码来解决这个问题。如果您自己手动执行 toString() 转换来创建 key ,则可以在 key 值之前添加一些类型信息,例如在上面的示例中,数字 4 的 key 变为 "num_4" 而不仅仅是“4”。为了防止与字符串 '"num_4"` 发生冲突,您还必须对字符串类型执行相同的操作。数字并不是唯一存在此问题的类型。事实上,在这个 ES6 Set polyfill 中,你可以看到生成了一个唯一键 here 。然后必须重新生成该唯一键并用于在集合中进行任何查找。

    关于javascript - javascript 的 Set 和普通的普通对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967074/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com