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 键。
我注意到 ES2015 中的 Set
没有实现简单的 toJSON
功能,例如序列化到数组。下面是我想出的实现:
Object.defineProperty(Set.prototype, 'toJSON', {
enumerable: false,
value: function () {
return [...this];
}
});
Set
没有序列化为数组有什么原因吗?
对于 toJSON
的这种覆盖是否有任何极端情况是个坏主意?
请参阅
但是,如果您想将这种方法添加到原型中以供您自己内部使用,而不会冒添加类似(但不相同)方法时可能出现的问题的风险,您 可以 使用 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 键。