在前端开发中,我们经常需要使用 JavaScript 对象表示数据,而在数据传输和存储时,我们通常使用 JSON(JavaScript Object Notation)格式。ES11(ECMAScript 2020)引入了一些新的特性来优化 JSON 对象的处理,使序列化和反序列化更加方便和高效。
JSON.stringify() 增强
JSON.stringify() 方法可以将 JavaScript 对象转换为 JSON 字符串,以便于传输和存储。ES11 对该方法进行了增强,使其支持更多的选项和更好的性能。
BigInt 支持
在 ES11 之前,如果 JavaScript 对象中包含 BigInt 类型的数据,那么在使用 JSON.stringify() 方法时会抛出错误。ES11 引入了对 BigInt 类型的支持,可以将 BigInt 类型的数据转换为字符串表示。
const obj = { num: BigInt(9007199254740991) }; const json = JSON.stringify(obj); console.log(json); // {"num":"9007199254740991"}
Map 和 Set 支持
在 ES11 之前,如果 JavaScript 对象中包含 Map 或 Set 类型的数据,那么在使用 JSON.stringify() 方法时会将其转换为空对象。ES11 引入了对 Map 和 Set 类型的支持,可以将其转换为数组表示。
// javascriptcn.com 代码示例 const map = new Map([ ["name", "Tom"], ["age", 18] ]); const json = JSON.stringify(map); console.log(json); // [["name","Tom"],["age",18]] const set = new Set(["apple", "banana", "orange"]); const json = JSON.stringify(set); console.log(json); // ["apple","banana","orange"]
toJSON() 方法支持
如果 JavaScript 对象中包含 toJSON() 方法,那么在使用 JSON.stringify() 方法时会调用该方法,并将其返回值作为 JSON 字符串的表示。这样我们就可以自定义 JavaScript 对象转换为 JSON 字符串的方式。
// javascriptcn.com 代码示例 const obj = { name: "Tom", age: 18, toJSON() { return { name: this.name.toUpperCase(), age: this.age }; } }; const json = JSON.stringify(obj); console.log(json); // {"name":"TOM","age":18}
JSON.parse() 增强
JSON.parse() 方法可以将 JSON 字符串转换为 JavaScript 对象。ES11 对该方法进行了增强,使其支持更多的选项和更好的性能。
reviver 函数支持
在 ES11 之前,JSON.parse() 方法只能将 JSON 字符串转换为普通的 JavaScript 对象。ES11 引入了 reviver 函数,可以自定义如何将 JSON 字符串转换为 JavaScript 对象。reviver 函数会在每个属性被解析时被调用,并且可以返回一个新的值来替换原始值。
const json = '{"name":"Tom","age":18}'; const obj = JSON.parse(json, (key, value) => { if (key === "age") { return value + 1; } return value; }); console.log(obj); // {name: "Tom", age: 19}
BigInt 支持
在 ES11 之前,如果 JSON 字符串中包含 BigInt 类型的数据,那么在使用 JSON.parse() 方法时会抛出错误。ES11 引入了对 BigInt 类型的支持,可以将字符串表示的 BigInt 类型的数据转换为 BigInt 类型。
// javascriptcn.com 代码示例 const json = '{"num":"9007199254740991"}'; const obj = JSON.parse(json); console.log(obj.num); // "9007199254740991" console.log(typeof obj.num); // "string" const obj2 = JSON.parse(json, (key, value) => { if (typeof value === "string" && /^\d+$/.test(value)) { return BigInt(value); } return value; }); console.log(obj2.num); // 9007199254740991n console.log(typeof obj2.num); // "bigint"
总结
ES11 引入了一些新的特性来优化 JSON 对象的处理,使序列化和反序列化更加方便和高效。我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为 JSON 字符串,并使用 JSON.parse() 方法将 JSON 字符串转换为 JavaScript 对象。在使用过程中,我们可以根据需要使用增强版的 JSON.stringify() 和 JSON.parse() 方法来更好地支持对象序列化和反序列化。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650f9f6f95b1f8cacd85045d