Skip to content

1. 核心概念 (Core Concept)

JSON.stringify() 是 JavaScript 内置的用来将 JavaScript 值(对象、数组、基本类型等)转换成 JSON 格式字符串的方法。JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。

2. 为什么需要它? (The "Why")

  • 数据序列化: 将复杂的 JavaScript 数据结构转换成字符串格式,便于在网络上传输(如发送 HTTP 请求体)或存储(如浏览器 localStorage)。
  • 跨语言数据交换: JSON 是一种独立于语言的数据格式,使得不同编程语言之间能够方便地交换数据。
  • 简便易用: JSON.stringify() 提供了标准、高效的方式来完成这一转换过程,无需手动拼接字符串。

3. API 与用法 (API & Usage)

JSON.stringify() 方法的语法如下:

javascript
JSON.stringify(value[, replacer[, space]])
  • value: 将要转换成 JSON 字符串的 JavaScript 值。
  • replacer (可选): 一个函数或者一个数组。
    • 如果是一个函数,它会接收两个参数 (key, value),用于转换或过滤属性值。
    • 如果是一个数组,它指定了要包含在 JSON 字符串中的属性名(或索引)的列表。
  • space (可选): 一个字符串或者一个数字,用于控制输出字符串的缩进和格式化。
    • 如果是一个数字,表示每一级的缩进空格数(最大 10)。
    • 如果是一个字符串(如 '\t' 或 ' '),用作缩进字符。

核心转换规则:

  • 基本类型:string, number, boolean 被转换为对应的 JSON 基本类型。null 转换为 null
  • undefined, Functions, Symbols:这些值在对象中会被忽略,在数组中会被转换成 null
  • BigInt:默认会抛出 TypeError
  • 对象 (Object):
    • 只包含可枚举的自身属性。
    • 属性名必须是字符串。
    • 属性值如果包含循环引用,会抛出 TypeError
    • 如果对象有 toJSON() 方法,则会调用该方法,并使用其返回值进行序列化。
  • 数组 (Array):
    • 元素会被转换为对应的 JSON 值。
    • undefined, Functions, Symbols 元素会被转换为 null

代码示例 (来自 MDN Web Docs):

基本用法:

javascript
const obj = {
  a: 1,
  b: [2, 3],
  c: 'hello',
  d: true,
  e: null,
  f: undefined, // 会被忽略
  g: function() {} // 会被忽略
};

console.log(JSON.stringify(obj));
// Output: {"a":1,"b":[2,3],"c":"hello","d":true,"e":null}

使用 replacer 数组:

javascript
const obj = {
  a: 1,
  b: 2,
  c: 3
};

console.log(JSON.stringify(obj, ['a', 'c']));
// Output: {"a":1,"c":3}

使用 replacer 函数:

javascript
const obj = {
  a: 1,
  b: 2,
  c: 'sensitive data'
};

console.log(JSON.stringify(obj, (key, value) => {
  if (key === 'c') {
    return 'redacted';
  }
  return value;
}));
// Output: {"a":1,"b":2,"c":"redacted"}

使用 space 进行格式化:

javascript
const obj = {
  a: 1,
  b: 2,
  c: {
    d: 3
  }
};

console.log(JSON.stringify(obj, null, 2));
/* Output:
{
  "a": 1,
  "b": 2,
  "c": {
    "d": 3
  }
}
*/

4. 关键注意事项 (Key Considerations)

  • 循环引用 (Circular References): JSON.stringify() 无法处理包含循环引用的对象,会抛出 TypeError
  • 不可序列化的值: undefined,函数, Symbols, BigInt(默认情况下)等值会被特殊处理或忽略,需要注意。
  • toJSON() 方法: 对象原型链上的 toJSON() 方法会影响序列化结果,它是重要的自定义序列化机制。
  • 数据丢失: 并非所有 JavaScript 数据结构都能完美序列化为 JSON,例如函数、Symbol、Date 对象会转换为字符串等,丢失了原始类型信息。

5. 参考资料 (References)

不知道说啥了很无语了