javascript中检查对象是否存在环

JavaScript中,为了保证代码健壮性,我们需要确认对象中不存在环,现在有2种方法检测js对象是否有环

  • 方法一
function cycleDetector (obj) {
    console.log(arguments)
  // 请添加代码
    let result = false;
    try {
        JSON.stringify(obj);
    } catch (e) {
        result = true;
    } finally {
        return result;
    }
}
  • 方法二
function cycleDetector2(obj) {
    let hasCircle = false,
        cache = [];

    (function(obj) {
        Object.keys(obj).forEach(key => {
            const value = obj[key]
            if (typeof value == 'object' && value !== null) {
                const index = cache.indexOf(value)
                if (index !== -1) {
                    hasCircle = true
                    return
                } else {
                    cache.push(value)
                    arguments.callee(value)
                    // (注:箭头函数没有arguments对象,此时的arguments指向该匿名函数的参数)
                }
            }
        })
    })(obj)

    return hasCircle
}

运行代码

const obj = {
  foo: {
    name: 'foo',
    bar: {
      name: 'bar',
      baz: {
        name: 'baz',
        aChild: null  //待会让它指向obj.foo
      }
    }
  }
}

obj.foo.bar.baz.aChild = obj.foo
var currentTime = new Date().getTime()
var flag = cycleDetector(obj)
var endTime = new Date().getTime()
var time = endTime - currentTime
console.error(flag, time)

var currentTime2 = new Date().getTime()
var flag2 = cycleDetector2(obj)
var endTime2 = new Date().getTime()
var time2 = endTime2 - currentTime2
console.error(flag2, time2)

返回结果

{ '0': { foo: { name: 'foo', bar: [Object] } } }
true 5
true 0

第一种才用try catch的捕获异常的方法来判断,需要的时间更长,代码更简洁。
第二种方法时间更快,但是它执行递归,逻辑较第一种更复杂,空间也需要更大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,199评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • LinShen杨菲 真正的成熟不是执着坚持,而是选择放下。所谓成长就是,随着时间的推移,你会慢慢发现曾经的所作所为...
    杨菲阅读 477评论 5 3
  • 有些姑娘对待该不该花男朋友钱这个问题上,总是很纠结。 貌似,倾向于经济独立,各花各的,你来我往的观点比较多。 那也...
    钱饭饭阅读 505评论 1 1
  • 向北大人学习,北大学霸可以把教授轰下台,这指的是学霸了解的不论是从理论层面还是从实践层面都远远超出了教授。
    杰科阅读 137评论 4 0