前言
作为前端开发者,在处理和操作数据时,JSON 数据格式是我们非常熟悉和常用的一种数据格式。我们通常会使用 JSON.stringify
将 JavaScript 对象转化为 JSON 字符串,也会使用 JSON.parse
将 JSON 字符串转化为 JavaScript 对象。然而,在 ES10 中,JSON.stringify
和 JSON.parse
发生了更新,并实现了 JavaScript 的 JSON 标准化,本文将从七个方面介绍这些更新内容及使用方法。
一、循环引用问题处理
在之前的版本中,当遇到 JavaScript 对象的某个属性被赋值为整个对象本身时,会出现循环引用的问题。例如下面的代码:
const obj = {a: 1}; obj.self = obj; JSON.stringify(obj); // Uncaught TypeError: Converting circular structure to JSON
而在 ES10 版本中,新增了 replacer
参数,用于处理循环引用问题,我们可以在 replacer
方法中将循环引用的属性删除即可。如下代码:
-- -------------------- ---- ------- ----- --- - --- --- -------- - ---- ------------------- ----- ------ -- - -- ---- --- ------- - ------ ---------- - ------ ------ --- -- -------
二、Bigint 类型支持
在 ES10 中,JSON.stringify
和 JSON.parse
均开始支持 Bigint 类型。在 JSON 对象中,我们可以使用 BigInt
方法将使用浮点数表示的大型数值转化为真正的大整数,例如下面的代码:
const bigNum = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1); JSON.stringify(bigNum); // "9007199254740992n" JSON.parse('"9007199254740992n"'); // 9007199254740992n
三、可替代的空值
在 ES10 中,我们可以配置 JSON.stringify
方法的第二个参数 replacer
,以排除对象中某些键值对进行序列化时,将其变成空值,如下面的代码:
const obj = {a: null, b: undefined, c: 123}; JSON.stringify(obj, ['a', 'b', 'd']); // {"a":null,"b":null}
四、Symbol 值支持
在 ES10 中,我们可以将 Symbol 值转化为 JSON 字符串,如下面的代码:
const newObj = { [Symbol('foo'): 'foo', [Symbol('bar')]: 'bar' }; JSON.stringify(newObj); // {}
可以看到,因为不能够支持 Symbol 类型的数据结构,所以在将其转换为 JSON 格式的字符串时,会被自动处理成 {}
空对象。
五、Intl.ListFormat 和 Intl.DateTimeFormat 类型支持
在 ES10 中,我们可以将 Intl.ListFormat
和 Intl.DateTimeFormat
两种类型数据序列化为 JSON 字符串。
const o = {listFormatter: new Intl.ListFormat()}; console.log(JSON.stringify(o)); // {"listFormatter":{}}
可以看到,这两种类型被序列化成了空对象。
六、其他数据类型支持
在 ES10 中,另外一些被支持序列化为 JSON 格式字符串的数据类型包括:Date, RegExp, Map, Set, ArrayBuffer 和 DataView。这些数据类型在 JSON 序列化为字符串时将始终按照 JavaScript 原生方法的输出格式进行处理。
七、Ecmascript 版本标记
在 ES10 中,JSON
对象新增了一个属性 revision
,用于标记当前环境是否是使用 Ecmascript 10 版本。当版本为 ES10 时,revision
属性的值为 "es10"
,否则为 undefined
。如下所示:
console.log(JSON.revision); // "es10"
总结
以上便是 ES10 中 JSON.stringify
和 JSON.parse
新增的七个方面的内容,对于前端开发者来说,这些更新内容对于处理 JSON 数据格式将会是非常实用且便捷的,同时也会对我们对于 JavaScript 基本类型的深入理解和运用提供更多的帮助。欢迎大家在实际项目中尝试使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f6a714f6b2d6eab3f3ab74