ES6 Set不会序列化为数组

时间:2016-02-16 18:26:00

标签: json serialization set ecmascript-6

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

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

Set是否有任何理由没有序列化为数组?

是否有任何边缘情况,toJSON的覆盖是个坏主意?

1 个答案:

答案 0 :(得分:1)

请参阅this answer,了解为什么地图不能有一般的toJSON案例,并且出于类似的原因,请设置。基本上,键和/或Set项可以是任何东西,包括对象和对无法序列化为JSON的其他东西的引用(记住,这是具有特定,更严格的规则的特定格式,而不仅仅是“变成另一个的可理解数据”)类型”)。无论如何,你想要的更像是“toArray”。你认为你的方法已经适用于那个内联,我认为它也适用于Array.from(Set)。

但是如果您想将这种方法添加到原型中以供您自己的内部使用,而不会冒任何可能的问题,如果添加了类似(但不完全相同)的方法,您可以使用符号key'd prop。

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键。