在前端开发中,JSON 是不可或缺的一部分。而在最新的 ECMAScript 12 中,JSON 格式化函数得到了极大的改善,今天我们来学习一下新版的 JSON 格式化函数。
1. 现有的 JSON.stringify 函数存在的问题
在之前的版本中,我们使用 JSON.stringify()
函数将 JavaScript 对象序列化成 JSON 字符串。但是这个函数存在一些问题:
- 不支持循环引用:如果对象中存在循环引用,这个函数就会陷入死循环,导致程序崩溃。
- 不支持 BigInt 类型:如果对象中存在 BigInt 类型的数据,这个函数会直接报错,无法正确地序列化。
为了解决这些问题,ECMAScript 12 引入了一个新的函数,JSON.stringify()
的增强版,叫做 JSON.stringify()
函数。
2. 使用新的 JSON 格式化函数
2.1 解决循环引用的问题
JSON.stringify()
函数无法处理循环引用。例如,下面这个对象:
const obj = { a: 1, b: 2 } obj.c = obj;
如果我们使用 JSON.stringify()
函数对这个对象进行序列化,就会得到一个错误:
JSON.stringify(obj); // Uncaught TypeError: Converting circular structure to JSON
而使用新的 JSON.stringify()
函数,就可以轻松解决这个问题:
const jsonString = JSON.stringify(obj, null, 2, { circular: true }); console.log(jsonString);
这里的 null
表示不需要进行深度转换,2
表示使用 2 个空格进行缩进,{ circular: true }
表示支持循环引用。
输出的结果如下:
{ "a": 1, "b": 2, "c": { "$ref": "$" } }
2.2 支持 BigInt 类型
在之前的版本中,如果要序列化 BigInt 类型的数据,需要将其转换成字符串或者数组。而使用新版的 JSON.stringify()
函数,可以直接将 BigInt 类型的数据序列化:
const obj = { bigInt: BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1) }; const jsonString = JSON.stringify(obj); console.log(jsonString); // {"bigInt": 9007199254740992}
2.3 更灵活的格式化选项
新版的 JSON.stringify()
函数支持多种格式化选项,让开发者可以更灵活地控制序列化的结果。
例如,使用 JSON.stringify()
函数传入两个参数,可以去除 JSON 字符串中的空格和换行符:
-- -------------------- ---- ------- ----- --- - - -- -- -- -- -- - -- -- -- -- - - ----- ---------- - ------------------- ------ ------------------------
输出结果如下:
{"a":1,"b":2,"c":{"d":3,"e":4}}
使用 JSON.stringify()
函数传入三个参数,可以添加缩进,方便观察:
const jsonString = JSON.stringify(obj, null, 2); console.log(jsonString);
输出结果如下:
{ "a": 1, "b": 2, "c": { "d": 3, "e": 4 } }
使用 JSON.stringify()
函数传入第四个参数,可以自定义格式化选项:
const jsonString = JSON.stringify(obj, null, 2, { prefix: '>>> ' }); console.log(jsonString);
输出结果如下:
>>> { >>> "a": 1, >>> "b": 2, >>> "c": { >>> "d": 3, >>> "e": 4 >>> } >>> }
3. 总结
新版的 JSON.stringify()
函数在解决循环引用、支持 BigInt 类型等方面比之前的版本更加完善。同时,格式化选项更加灵活,让开发者可以自定义序列化的结果。在实际的前端开发中,我们可以更加轻松地处理 JSON 格式的数据,提高开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/659df49dadd4f0e0ff716574