我注意到ES2015中的Set
没有实现简单的toJSON
函数,例如序列化到数组。以下是我提出的实现:
Object.defineProperty(Set.prototype, 'toJSON', {
enumerable: false,
value: function () {
return [...this];
}
});
Set
是否有任何理由没有序列化为数组?
是否有任何边缘情况,toJSON
的覆盖是个坏主意?
答案 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键。