3

### 题目

JSON.stringify 的功能是,将一个 javascript 字面量对象转化为一个JSON格式的字符串。例如

const obj = {a:1, b:2}

JSON.stringify(obj) // => '{"a":1,"b":2}'

当要转化的对象有“环”存在时,为了避免死循环,JSON.stringify 会抛出异常,例如:

const obj = {
  foo: {
    name: 'foo'
  },
  bar: {
    name: 'bar'
    baz: {
      name: 'baz',
      next: null // 将指向obj.bar
    }
  }
}

obj.bar.baz.next = obj.bar

JSON.stringify(obj) // => TypeError: Converting circular structure to JSON

假设入参是字面量对象,属性名是字符串,属性值要么是数字字面量,要么是字面量对象,不考虑json排版,JSON.stringify的简化版实现如下:

/**
 * “环”检查器
 */
function detectorCircular(obj) {
  // 请实现
}

/**
 * JSON.stringify简化实现
 * @param obj 要转化为字符串的对象
 * @param ignoreCircular 是否忽略“环”检查
 */
function stringify(obj, ignoreCircular = false) {
  if (!ignoreCircular && detectorCircular(obj)) {
    throw new TypeError('Converting circular structure to JSON')
  }

  const keys = Object.keys(obj)
  
  if (!keys.length) {
    return '{}'
  }
  
  const content = keys.map(key => {
    const value = obj[key]
    
    if (typeof value === 'number') {
      return `"${key}":${value}`
    } else {
      return `"${key}":${stringify(value, true)}`
    }
  }).join(',')
  
  return `{${content}}`
}

请实现上述代码中的 detectorCircular 函数。


Y3G
458 声望14 粉丝

桌面软件、 web前端、 移动app混合开发、 安防行业技术