是否有已知的方法或库已经有帮助程序来评估一个对象在 JavaScript 中是否可序列化?
我尝试了以下方法,但它没有涵盖原型(prototype)属性,因此它提供了误报:
_.isEqual(obj, JSON.parse(JSON.stringify(obj))
还有另一个 lodash 函数可能会让我更接近真相,_.isPlainObject
。然而,当 _.isPlainObject(new MyClass())
返回 false
时,_.isPlainObject({x: new MyClass()})
返回true
,因此需要递归应用。
在我自己冒险之前,有没有人知道一种已经可靠的方法来检查 JSON.parse(JSON.stringify(obj))
是否会实际产生与 相同的对象对象
?
最佳答案
function isSerializable(obj) {
var isNestedSerializable;
function isPlain(val) {
return (typeof val === 'undefined' || typeof val === 'string' || typeof val === 'boolean' || typeof val === 'number' || Array.isArray(val) || _.isPlainObject(val));
}
if (!isPlain(obj)) {
return false;
}
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
if (!isPlain(obj[property])) {
return false;
}
if (typeof obj[property] == "object") {
isNestedSerializable = isSerializable(obj[property]);
if (!isNestedSerializable) {
return false;
}
}
}
}
return true;
}
递归迭代所有给定的对象属性。它们可以是:
- 普通对象(“由 Object 构造函数创建的对象或 [[Prototype]] 为 null 的对象。”- 来自 lodash 文档)
- 数组
- 字符串、数字、 bool 值
- 未定义
传递的 obj
中的任何其他值都会导致它被理解为“不可序列化”。
(老实说,我不是绝对肯定我没有忽略对某些可序列化/不可序列化数据类型的检查,实际上我认为这取决于“可序列化”的定义 - 欢迎任何意见和建议.)
关于javascript - 检查对象在 JavaScript 中是否可序列化的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579940/