js object circle reference checker & JSON.stringify bug All In One
js object circle reference checker & JSON.stringify bug All In One
js 检测对象是否存在循环引用
try...catch & JSON.stringify()
const objectCircleReferenceChecker = (obj = {}) => {
let result = false;
try {
JSON.stringify(obj);
} catch (err) {
console.error('error =', err);
result = true;
}
return result;
}
// test
const obj = {};
obj.k = {
v: obj,
};
objectCircleReferenceChecker(obj);
// true
const objectHasCircleReference = (obj = {}) => {
function findCircle(obj, arr){
// ???
const source = [...arr, obj];
for(const key in obj) {
if(typeof obj[key] === 'object') {
if(source.indexOf(obj[key]) > -1 || findCircle(obj[key], source)) {
return true;
}
// if(source.indexOf(obj[key]) > -1) {
// return true;
// } else {
// return findCircle(obj[key], source);
// }
}
}
return false;
}
return findCircle(obj, []);
}
// test
const obj = {};
obj.k = {
v: obj,
};
objectHasCircleReference(obj);
// true
demo
const ruleForm = {
testKey1: null,
testKey2: undefined,
// ❌ value 是 undefined 的 key 序列化后会被删除掉
func: function () {
console.log('function');
},
// ❌ value 是 function 的 key 序列化后会被删除掉
desc: Symbol('symbol'),
// ❌ value 是 symbol 的 key 序列化后会被删除掉
testKey3: NaN,
// ✅ value 是 NaN 的 key 序列化后会被转换成 null
str: '',
bool: false,
arr: [],
obj: {},
};
console.log(`form data =`, JSON.stringify(ruleForm, null, 4));
/*
form data = {
"testKey1": null,
"testKey3": null,
// ✅ value 是 NaN 的 key 序列化后会被转换成 null
"str": "",
"bool": false,
"arr": [],
"obj": {}
}
*/
JSON.stringify bug
https://github.com/xgqfrms/learning/issues/74
https://codepen.io/xgqfrms/pen/PobVdxo?editors=1111
refs
©xgqfrms 2012-2020
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/16010654.html
未经授权禁止转载,违者必究!