xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

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, 禁止转载 🈲️,侵权必究⚠️!


posted @ 2022-03-15 21:56  xgqfrms  阅读(48)  评论(3编辑  收藏  举报