在实现一个JSON.stringify
功能时,我们需要考虑几个关键点:正确处理不同类型的数据(如字符串、数字、对象、数组等),处理循环引用和其他边界情况,以及保证转换后的字符串格式正确。下面我们一步步来实现简化版的JSON.stringify
。
第一步:基础类型处理
对于基础数据类型,处理相对简单:
- 数字:直接转换为其字符串形式。
- 字符串:需要加上引号,并处理特殊字符,如转义字符。
- 布尔值:转换为
"true"
或"false"
。 null
:直接返回"null"
。
第二步:数组和对象
对于数组和对象,需要递归处理其内部元素:
- 数组:遍历数组的每个元素,对每个元素应用
stringify
,然后将结果用逗号连接,最后加上[]
。 - 对象:遍历对象的每个可枚举属性,对键和值应用
stringify
,然后将结果用冒号和逗号连接,注意键名需要加引号,最后加上{}
。
第三步:特殊情况处理
- undefined、函数和symbol:在JSON中这些类型是不被允许的,通常应该返回
undefined
或者在数组中被转换为null
。 - 循环引用:需要维护一个已访问对象的记录,如果检测到循环引用,应抛出错误或者别的处理方式。
示例实现
这里是一个简化的示例实现,只包含基础的功能:
javascriptfunction jsonStringify(obj) { const type = typeof obj; if (type !== 'object' || obj === null) { // 非对象或null直接返回文本 if (type === 'string') obj = '"' + obj + '"'; return String(obj); } else { const json = []; const isArray = Array.isArray(obj); for (const key in obj) { let value = obj[key]; const valueType = typeof value; if (valueType === 'string') { value = '"' + value + '"'; } else if (valueType === 'object' && value !== null) { value = jsonStringify(value); } json.push((isArray ? "" : '"' + key + '":') + String(value)); } return (isArray ? "[" : "{") + String(json) + (isArray ? "]" : "}"); } }
测试示例
javascriptconsole.log(jsonStringify({ x: 5, y: 6 })); // 输出:{"x":5,"y":6} console.log(jsonStringify([1, "false", false])); // 输出:[1,"false",false] console.log(jsonStringify({ x: [10, undefined, function(){}, Symbol('')] })); // 输出:{"x":[10,null,null,null]}
这个实现非常基础,许多复杂情况如日期对象、正则对象、BigInt、循环引用等情况都没有处理。在实际开发中,需要根据具体需求添加更多的处理逻辑和优化。