Appearance
2633. 将对象转换为 JSON 字符串
ts
type JSONValue =
| null
| boolean
| number
| string
| JSONValue[]
| { [key: string]: JSONValue }
function jsonStringify(value: JSONValue): string {
if (value === null) return 'null'
if (typeof value === 'number' || typeof value === 'boolean')
return String(value)
if (typeof value === 'string') return `"${value}"`
if (Array.isArray(value)) {
const res = value.map((v) => jsonStringify(v))
return `[${res.join(',')}]`
}
if (typeof value === 'object') {
const res = Object.entries(value).map(
([key, val]) => `"${key}":${jsonStringify(val)}`
)
return `{${res.join(',')}}`
}
return ''
}递归结构
JSON.stringify 本质上是一个递归遍历器。它根据当前值的类型决定如何序列化:
- null → 字符串
"null" - number/boolean → 直接转字符串(
String(value)) - string → 包裹双引号
- array →
[+ 递归处理每个元素 +] - object →
{+ 递归处理每个 key-value 对 +}
递归的终止条件是遇到基本类型,最大深度取决于对象的嵌套层级。
这个实现没有处理的情况
完整的 JSON.stringify 还需要处理很多边界:
- 特殊数字:
NaN和Infinity应返回"null",而非"NaN"/"Infinity" - undefined 和函数:作为对象属性值时应被忽略,作为数组元素时应转为
null - 循环引用:抛出 TypeError
- 字符串转义:双引号、反斜杠、换行符等需要转义
- toJSON 方法:如果对象有
toJSON(),应序列化其返回值
题目里的 JSONValue 类型被限制在特定子集内,所以大部分边缘情况不会出现。放到完整实现里,字符串转义、特殊值和循环引用这些分支都还需要补齐。
