ES6 Set 不序列化到数组

ES6 Set does not serialize to array

我注意到 ES2015 中的 Set 没有实现简单的 toJSON 功能,例如序列化到数组。下面是我想出的实现:

Object.defineProperty(Set.prototype, 'toJSON', {
    enumerable: false,
    value: function () {
        return [...this];
    }
});

Set 没有序列化为数组有什么原因吗?

对于 toJSON 的这种覆盖是否有任何极端情况是个坏主意?

请参阅 了解为什么地图和集合不能有一般的 toJSON 情况。基本上,键 and/or 集合项可以是任何东西,包括对象和对其他无法序列化为 JSON 的事物的引用(请记住,这是一种具有特定、更严格规则的特定格式,而不仅仅是 "turn into intelligible data of another type").无论如何,您在这里想要的更像是 "toArray" 。您的方法已经适用于该内联,我认为 Array.from(Set) 也是如此。

但是,如果您想将这种方法添加到原型中以供您自己内部使用,而不会冒添加类似(但不相同)方法时可能出现的问题的风险,您 可以 使用 Symbol key'd 道具。

var toArray = Symbol('toArray');
Object.defineProperty(Set.prototype, toArray, {
    enumerable: false,
    value: function () {
        return [...this];
    }
});

var g = new Set();
g.add(9);
g[toArray]();//-> [9]

如果你这样做,那么除了你自己的代码之外,你保证不会引起任何问题,因为只有你的代码才能访问引用该方法的 toArray Symbol 键。