### 题目
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 函数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。